2. 前端读取到身份证信息后后端制作身份证图片 2.1、controllerhttps://blog.csdn.net/Ajie246862/article/details/125259211
@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 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.*;
@Slf4j
public class IdcardImageUtils {
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;
}
}
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;
}
}
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;
}
}
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、图片模板



