栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA身份证阅读器数据返回图片

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA身份证阅读器数据返回图片

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

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

2. 前端读取到身份证信息后后端制作身份证图片 2.1、controller
	
    @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、图片模板


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/973076.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号