1. 身份证读取请看上一篇

https://blog.csdn.net/Ajie246862/article/details/125259211

2. 前端读取到身份证信息后后端制作身份证图片

2.1、controller

 /*** 传入头像-身份证信息* @Author 阿杰* @param request 身份证信息*/@PostMapping("/idcard/pic")public Result idcardFace(@RequestBody MultipartFile file, HttpServletRequest request) throws Exception {if (file == null || file.isEmpty()) {return AjaxResult.error("身份证读取错误");}// 身份证正面模板图片ClassPathResource face = new ClassPathResource("idcard/face.png");// 更改头像 放大、去背景(身份证读卡器头像为白底102px*126px)BufferedImage bufferedImage = IdcardImageUtils.convertIcon(file.getInputStream());BufferedImage icon = IdcardImageUtils.cancelBackgroudColor(bufferedImage);// 绘制正面InputStream idcardFace = IdcardImageUtils.idcardFace(face.getInputStream(), icon, request);// 身份证反面模板图片ClassPathResource back = new ClassPathResource("idcard/back.png");// 绘制反面InputStream idcardBack = IdcardImageUtils.idcardBack(back.getInputStream(), request);// 上传String faceName = minioUtils.uploadReduce(idcardFace, "face.png");idcardFace.close();String backName = minioUtils.uploadReduce(idcardBack, "back.png");idcardBack.close();Map<String, String> map = new HashMap<>();map.put("face", faceName);map.put("back", backName);return Result.success("上传成功", map);}

2.2、IdcardImageUtils身份证正反面制作工具类

package com.ajie.utils;import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;/*** 图片处理工具类** @Date 2021/12/17 9:39* @Create ajie*/
@Slf4j
public class IdcardImageUtils {/*** 绘制身份证正面* @param inputStream 模板图片* @param icon 头像* @param request 正面信息* @return*/public static InputStream idcardFace(InputStream inputStream, BufferedImage icon, HttpServletRequest request) {try {//通过JPEG图象流创建JPEG数据流解码器BufferedImage buffImg = ImageIO.read(inputStream);//解码当前JPEG数据流,返回BufferedImage对象//得到画笔对象Graphics2D g = buffImg.createGraphics();//设置添加字体颜色。g.setColor(Color.BLACK);//得到头像ImageIcon imgIcon = new ImageIcon(icon);//得到Image对象Image img = imgIcon.getImage();//绘制头像g.drawImage(img, 621, 100, null);// 绘制姓名Font nameFont = new Font("黑体", Font.PLAIN, 42);g.setFont(nameFont);String name = request.getParameter("name");// 得到每个字符String regex = "(.)";if (name.length() == 2) {name = name.replaceAll (regex, "$1  ");} else if (name.length() == 3) {name = name.replaceAll (regex, "$1 ");}g.drawString(name, 185, 125);// 绘制其他信息Font ortherFont = new Font("黑体", Font.PLAIN, 32);g.setFont(ortherFont);// 性别g.drawString(request.getParameter("sex"), 185, 202);// 民族g.drawString(request.getParameter("nation"), 387, 202);// 出生 - 年g.drawString(request.getParameter("year"), 185, 283);// 出生 - 月g.drawString(request.getParameter("month"), 341, 283);// 出生 - 日g.drawString(request.getParameter("day"), 432, 283);// 住址String address = request.getParameter("address");if (address.length() > 11) {g.drawString(address.substring(0, 11), 185, 364);g.drawString(address.substring(11), 185, 413);} else {g.drawString(address, 185, 364);}Font idcardFont = new Font("华文细黑", Font.BOLD, 31);g.setFont(idcardFont);String idcard = request.getParameter("idcard");idcard = idcard.replaceAll (regex, "$1 ");// 绘制身份证号g.drawString(idcard, 343, 561);// 结束绘制g.dispose();//创键编码器,用于编码内存中的图象数据ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(buffImg, "png", byteArrayOutputStream);ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());byteArrayOutputStream.flush();byteArrayOutputStream.close();return arrayInputStream;} catch (Exception e) {log.error("身份证正面绘制失败--> {}", e.getMessage());return null;}}/*** 身份证反面绘制* @param inputStream 反面模板* @param request 数据* @return*/public static InputStream idcardBack(InputStream inputStream, HttpServletRequest request) {try {//解码当前JPEG数据流,返回BufferedImage对象BufferedImage buffImg = ImageIO.read(inputStream);//得到画笔对象Graphics2D g = buffImg.createGraphics();g.setColor(Color.BLACK);// 绘制其他信息Font ortherFont = new Font("黑体", Font.PLAIN, 32);g.setFont(ortherFont);// 签发机关g.drawString(request.getParameter("lssueOffice"), 424, 479);// 签发时间g.drawString(request.getParameter("lssueTime") + "-" + request.getParameter("invalidTime"), 424, 565);// 结束绘制g.dispose();//创键编码器,用于编码内存中的图象数据ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(buffImg, "png", byteArrayOutputStream);ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());byteArrayOutputStream.flush();byteArrayOutputStream.close();return arrayInputStream;} catch (Exception e) {log.error("身份证反面绘制失败--> {}", e.getMessage());return null;}}/*** 改变图片大小* @param inputStream* @return 返回图片对象*/public static BufferedImage convertIcon(InputStream inputStream) {try {BufferedImage image = ImageIO.read(inputStream);int width = image.getWidth() * 3;int height = image.getHeight() * 3;BufferedImage resizedImage = new BufferedImage(width, height, image.getType());Graphics2D g = resizedImage.createGraphics();g.drawImage(image, 0, 0, width, height, null);g.dispose();g.setComposite(AlphaComposite.Src);g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);return resizedImage;} catch (Exception e) {return null;}}/*** 去背景颜色--白底* @param image 处理的图片对象* @return*/public static BufferedImage cancelBackgroudColor(BufferedImage image) {ImageIcon imageIcon = new ImageIcon(image);BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(), BufferedImage.TYPE_4BYTE_ABGR);Graphics2D g = bufferedImage.createGraphics();g.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());int alpha = 0;for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {int rgb = bufferedImage.getRGB(j2, j1);int R = (rgb & 0xff0000) >> 16;int G = (rgb & 0xff00) >> 8;int B = (rgb & 0xff);if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);}bufferedImage.setRGB(j2, j1, rgb);}}g.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());g.dispose();return bufferedImage;}
}

2.3、图片模板


JAVA身份证阅读器数据返回图片相关推荐

  1. Java身份证阅读器(HX-FDX3S HX-FDX5)

    Java用身份证阅读器读取身份证的基本信息,阅读器型号为华旭(HX-FDX3S HX-FDX5). 产品自带了几个Demo,唯独没有Java的.用Java写了个Demo.基本思路,用JNA调取原生sd ...

  2. 新中新身份证阅读器不显示图片

    USB接口的新中新身份证阅读器使用过程中,出现读卡不显示图片,以及刷卡多次后,软件自动关闭的现象.使人很苦恼,经过我的反复测试,现在提供解决方法如下: 1.下载动态库链接文件"WltRS&q ...

  3. VUE整合信通身份证阅读器返回读取到的数据或将身份证图片返回

    需求:身份证阅读器在浏览器上接入读取身份证信息 JAVA后端身份证图片合成https://blog.csdn.net/Ajie246862/article/details/125259692 1. 身 ...

  4. 华视100UC 身份证阅读器 Java

    华视100UC 身份证阅读器 Java 哪位大佬有64位可用的dll文件,施舍给小弟吧,万分感谢 功能 环境 个人想法(有不对的地方希望大佬指正) 对于dll文件的想法 目录结构 1. pom.xml ...

  5. 二代身份证阅读器 C#、JAVA调用教程

    型号:普天CPIDMR02/TG身份证阅读器 SDK版本:2020 (我这不提供下载,自己咨询卖家,或者网上自己找,SDK 厂家不二次封装的机器理论通用) 新老版本区别: 多了外国人永久居留身份证.港 ...

  6. JNA二次开发华视身份证阅读器

    JNA二次开发华视身份证阅读器 前言 添加依赖 SDK资料 编写代码 遇到的问题(坑) 前言 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative,其中JNA调用 ...

  7. Kotlin之身份证阅读器(华视)二次开发

    一.简介 身份证阅读器使用场景比较多,围绕它按照自己的需求进行二次开发的也不少,我这次也是围绕身份证阅读器进行二次开发,不过使用的是kotlin作为开发的语言,资料比较少,参考了java的开发设计JA ...

  8. C#如何读取身份证阅读器

    不同的身份证读卡器,其动态库不一样,新中新二代身份证阅读器,型号:DKQ-A16D,eg: using System; using System.Collections.Generic; using  ...

  9. 公安部身份证阅读器模块SAM通讯协议

    公安部身份证阅读器模块SAM通讯协议 图为:公安部身份证阅读器SAM模块照片 图为:东信新一代小身份证SAM模块 支持Windows.Android.Linux.ARM.单片机等各系统二次开发. 一. ...

  10. 华视身份证阅读器SDK使用手册

    华视身份证阅读器SDK使用手册 V1.33 华视电子读写设备有限公司  2008年07月11日 概述 本手册是操作身份证阅读器动态库应用函数的定义格式.调用方法和返回值的说明.在使用前,请确认授权文件 ...

最新文章

  1. 黄海广博士的机器学习个人笔记及深度学习笔记
  2. linux pthread_join 使用记录
  3. 8个月打磨,一份送给程序员的「分布式系统」合集
  4. 小程序 setData 中的坑,其实好像...
  5. java开发环境:还在配classpath?你out啦!
  6. java url 授权,Spring MVC框架 - 基本认证之URL 授权认证
  7. 1.9 编程基础之顺序查找 07 不与最大数相同的数字之和
  8. Android NDK开发之 ARM与NEON指令说明
  9. 【2019 BAPC - D】Deck Randomisation【中国剩余定理 + 循环节】
  10. ubuntu14.04编译ffmpeg的过程
  11. vs2015安装+下载详细教程
  12. 虚拟机xp系统如何安装--win10专业版
  13. Springboot结合Redis实现分布式定时任务
  14. Matlab中的数据类型
  15. Android进阶——更节电的后台任务JobScheduler 机制使用详解
  16. 远程连接出现 登陆失败:用户账户限制 解决方案
  17. FFmpeg 工具:音视频开发都用它,快@你兄弟来看丨音视频工具
  18. JAVA-0基础学习笔记-day01
  19. 用C语言学生成绩数据库排序功能设计,[c语言学生成绩管理系统]C语言学生成绩管理系统实验报告...
  20. QueryWrapper常用方法

热门文章

  1. 电源纹波和电源噪声有什么区别?
  2. java pdf转图片base64,itextpdf 实现html转pdf中中文及图片base64的解决方法
  3. 0x77A26B83 (ntdll.dll) 处有未经处理的异常: 0xC0000374: 堆已损坏。
  4. 网页版在线使用PS网站源码
  5. 魔兽世界3区部落最多的服务器,魔兽世界怀旧服玩家为你推荐,不用排队、非鬼服非单阵营的服务器...
  6. 新手上路千万记住学会用灯
  7. 基于JavaEE的医院网上预约挂号系统
  8. MLO/uboot-spl.bin和uboot.img/uboot.bin
  9. 初探Java设计模式4:JDK中的设计模式
  10. 【CV系列】昼夜图像区分算法