身份证解析:如何从网络中获取图片或视频为byte数组

问题介绍:

最近在项目中发现以前早期接口只是把身份证照片存储了起来,而并未解析身份证图片,导致之前早期用户得身份证信息不存在。所以需要写一个工具来实现自动解析存储的身份证照片然后存入到数据库中。

思路:

(1):读取数据库中用户的身份证照片的url然后从网络中下载此文件到本地,然后再进行读取。这种方法笨重,效率低,会产生过多的io操作,所以废弃。
(2):综上原因,可以直接从对应的url中的得到此文件的二进制流数据进行解析,减少文件io操作。

示例Demo:

解析身份证图片采用的是百度的身份证识别sdk,免费版每天有500次的限制,可以自己简单玩一下了,具体使用步骤请参考官方文档。
官方提供了一个直接传递url得接口,但是我传递之后不知道为什么不能解析,好奇。。。。

public class Test {

    //设置APPID/AK/SK
    public static final String APP_ID = "16995821";
    public static final String API_KEY = "6VnIvPKAdt3mnGE3Xw958Pi5";
    public static final String SECRET_KEY = "32YSXo3ajeIATBGwtscyG1I9OvwQe1Vf";

    private static void sample() {
        // 初始化一个AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
        // 传入可选参数调用接口
        HashMap options = new HashMap<>(3);
        options.put("detect_direction", "false");
        options.put("detect_risk", "false");

        String idCardSide = "front";

        // 参数为本地路径
        //String image = "D:/48336_201808311103257645596.png";
        /*String image = "D:/image_31751_20190809035821634_7871.png";
        JSONObject res = client.idcard(image, idCardSide, options);
        System.out.println(res.toString(2));*/


        String url = "https://xxxxxx.png";
        //String url = "https://xxxxxx.png";

		//百度提供的直接传递url和解析参数得接口
        /*JSONObject res = client.basicGeneralUrl(url, options);
        System.out.println(res.toString(2));*/

        byte[] bytes = getImageByteArray(url);
        if(null == bytes){
            HashMap map = new HashMap<>(3);
            map.put("code", 0);
            map.put("message", "获取图片二进制数组出现错误");
            System.out.println(map.get("message"));
        }

        // 参数为二进制数组
        JSONObject res = client.idcard(bytes, idCardSide, options);
        System.out.println(res.toString(2));

    }


    /**
     * 获取URL图片的二进制数组
     * @param picUrl
     * @return
     */
    private static byte[] getImageByteArray(String picUrl) {
        ByteArrayOutputStream outputStream = null;
        InputStream inputStream = null;
        try {
        	//通过url获取连接之后读取
            URL url1 = new URL(picUrl);
            HttpURLConnection connection = (HttpURLConnection)url1.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5 * 1000);
            inputStream = url1.openStream();
            outputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }

            inputStream.close();
            return outputStream.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(null != outputStream){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(null != inputStream){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    public static void main(String[] args) {
        sample();
    }
}

返回值如下:

{
  "log_id": 6277781237268xxxx,
  "words_result": {
    "姓名": {
      "words": "肖xx",
      "location": {
        "top": 52,
        "left": 121,
        "width": 51,
        "height": 18
      }
    },
    "民族": {
      "words": "汉",
      "location": {
        "top": 90,
        "left": 203,
        "width": 11,
        "height": 14
      }
    },
    "住址": {
      "words": "湖北省荆门市xxxx",
      "location": {
        "top": 159,
        "left": 119,
        "width": 171,
        "height": 39
      }
    },
    "公民身份号码": {
      "words": "42232319xxxx",
      "location": {
        "top": 245,
        "left": 183,
        "width": 238,
        "height": 22
      }
    },
    "出生": {
      "words": "xxx",
      "location": {
        "top": 124,
        "left": 117,
        "width": 137,
        "height": 14
      }
    },
    "性别": {
      "words": "男",
      "location": {
        "top": 90,
        "left": 119,
        "width": 10,
        "height": 15
      }
    }
  },
  "words_result_num": 6,
  "image_status": "normal"
}

百度接口对于身份证的解析有时候会丢失一些数据(可能跟照片的清晰度,角度,生僻字和光线?有关),比如身份证有效期未识别出,姓名为空。。。所以再实际开发中我们应该仔细校验所需参数是否已经解析完成,如果没有就应该让用户从新拍摄更清晰的照片(我这都是之前项目埋得坑。。。)

你可能感兴趣的:(java工具集)