千家信息网

java zxing怎么合成复杂二维码图片

发表于:2025-02-21 作者:千家信息网编辑
千家信息网最后更新 2025年02月21日,本篇内容介绍了"java zxing怎么合成复杂二维码图片"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2025年02月21日java zxing怎么合成复杂二维码图片

本篇内容介绍了"java zxing怎么合成复杂二维码图片"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

整体思路:

引入zxing成熟的二维码生成接口,生成标准二维码文件,通过java图形图像处理API为二维码添加相关文字描述,根据需要,可以为合成后的图片添加相关背景。示例如下图所示:

  • 1.先拿点位图来说,生成二维码图片核心代码如下

        /**         * 定义二维码的参数         */        HashMap hints = new HashMap();        //指定字符编码为"utf-8"        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");        //指定二维码的纠错等级为中级        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);        //设置图片的边距        hints.put(EncodeHintType.MARGIN, 1);        /**         * 生成二维码         */        try {            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT, hints);            Path file = new File(filePath).toPath();            MatrixToImageWriter.writeToPath(bitMatrix, format, file);        } catch (Exception e) {            log.error("二维码生成出错:/permitDownload: error", e);        }
  • 2.给二维码添加文字

    /**     * 给二维码下方添加说明文字     *     * @param image 原二维码     * @param topText  顶部说明文字     * @param downText 底部说明文字     * @return 带说明文字的二维码     */    private static BufferedImage addNote(BufferedImage image, String topText, String downText) {        Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT);        BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);        Graphics2D g2 = tag.createGraphics();//设置文字        g2.setColor(Color.BLACK);        g2.setBackground(Color.WHITE);        g2.clearRect(0,0,QRCODE_WIDTH, IMAGE_HEIGHT);        //设置顶部文本并计算坐标        // 保证操作系统包含"宋体"字体,如果没有上传字体至JAVA_HOME/jre/lib/fonts下        FontMetrics fm = getFontByWidth(new Font("宋体", Font.PLAIN, DEFAULT_FONT_SIZE), topText, g2);        //文字的宽度        int fontWidth = fm.stringWidth(topText);        //文字高度        int fontHeight = fm.getHeight();        /**         * 顶部添加文字并居中         */        g2.drawString(topText, (QRCODE_WIDTH - fontWidth) / 2,  (TEXT_DEFAULT_HEIGHT - fontHeight) / 2 + fm.getFont().getSize());        /**         * 绘制二维码         */        g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null);        // 设置底部文字字体并计算坐标        // 保证操作系统包含"宋体"字体,如果没有上传字体至JAVA_HOME/jre/lib/fonts下        fm = getFontByWidth(new Font("宋体", Font.PLAIN, DEFAULT_FONT_SIZE), downText, g2);        //文字的宽度        fontWidth = fm.stringWidth(downText);        //文字高度        fontHeight = fm.getHeight();        /**         * 添加底部文字         */        g2.drawString(downText, (QRCODE_WIDTH - fontWidth) / 2,  QRCODE_HEIGHT + TEXT_DEFAULT_HEIGHT+(TEXT_DEFAULT_HEIGHT - fontHeight) / 2 + fm.getFont().getSize());        g2.dispose();        image = tag;        image.flush();        return image;    }

知识点 : 底部文字长度会变,目前设计只放一行文字,所以根据字数多少会动态改变文字大小在一个合理区间(不至于太小无法识别),使用FontMetrics 对象,这个点会对多数同学有帮助

  • 3.动态修改字体及大小

    /**     * 根据文字长度改变文字大小     *     * @param font 默认字体     * @param note 文字内容     * @param g2 图像画布     * @return 处理后的字体封装     */    private static FontMetrics getFontByWidth(Font font, String note, Graphics2D g2) {        FontMetrics fm = g2.getFontMetrics(font);        int textWidth = fm.stringWidth(note);//文字的宽度        if (textWidth > QRCODE_WIDTH) {            int fontSize = (int) ((TEMP_PARAM / textWidth) * font.getSize());            font = new Font(font.getName(), font.getStyle(), fontSize);        }        g2.setFont(font);        return g2.getFontMetrics(font);    }
  • 4.最后一步将蓝色底图与二维码图片合成,就可以了。

图片合成四部曲

第一步:创建画布,需要设置画布的宽、高,单位应该是像素

BufferedImage tag = new BufferedImage(QRCODE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);

第二步: 在画布上创建图形对象Graphics2D,可以根据你对图像知识点的了解设置如背景、前景、边框、宽度等信息

Graphics2D g2 = tag.createGraphics();//设置文字

第三步: 合成图片,过程中的图片添加顺序、图片大小、坐标位置会影响最终的呈现效果,如果最终效果没有达到设计需求,调整这三个参数一定会有所帮助

Image src = image.getScaledInstance(QRCODE_WIDTH, QRCODE_HEIGHT, Image.SCALE_DEFAULT);... /*** 绘制二维码 */g2.drawImage(src, 0, TEXT_DEFAULT_HEIGHT, null);

第四步: 生成最终的新图片

    /**     * 给二维码图片添加背景图片     *     * @param qrPic   二维码     * @param backImage 背景图片     */    private static void createNewPng(File qrPic, BufferedImage backImage) {        try {            if (!qrPic.isFile()) {                log.error("二维码临时路径不存在!");            }            /**             * 读取背景图片,并构建绘图对象--画布             */            Graphics2D g = backImage.createGraphics();            /**             * 读取二维码图片             */            BufferedImage qrcodeImage = ImageIO.read(qrPic);            //开始绘制图片            g.drawImage(qrcodeImage, 48, 120, qrcodeImage.getWidth(), qrcodeImage.getHeight(), null);            g.dispose();            ImageIO.write(backImage, "png", qrPic);        } catch (Exception e) {            log.error("绘制二维码出错!");        }    }

第二张图片和第一张图片生成过程相同,只是将文中 【2. 给二维码添加文字】中的顺序由上、中、下变为 左、右即可

踩过的坑

  • 背景图片像素、大小需要和二维码匹配,否则会出现二维码与背景比例严重失调或二维码显示不完整

  • 二维码添加文字乱码 开发环境(windows),测试环境(centos 服务器版)。本地开发测试没有任何问题,打包部署至服务器后所有中文字符出现乱码(各种转码,字体设置,调试整了很久),问题仍然没有任何变化。最终灵光一现怀疑是系统字体问题,查了测试环境(centos)字体信息确实没有"宋体",设置成系统自有或默认的字体,问题还在。最终从(c:\windows\fonts\simsun.ttc)开发系统中copy字体至测试系统(JAVA_HOME/jre/libs/fonts)中后重启应用,问题得到完美解决。系统安装部署需要准备字体有点麻烦,不知道还有没有更好的办法,字体有逻辑字体和物理字体,爱、先这样吧。

  • 背景图片加载问题 项目为springboot项目,背景图片存放在resources文件夹下,本地开发测试未见异常,打包部署至服务器后背景图片无法找到,原始代码如下

        String backFilePath = "template/down.png";        ClassPathResource resource = new ClassPathResource(backFilePath);        File file = resource.getFile();

在网上找加载图片的方法都使用过,没有效果,最后修改为输入流,图片合成正常,代码如下

        /**         * 必须通过流方式,否则不同操作系统无法拿到背景图片信息         */        String backFilePath = "template/down.png";        ClassPathResource resource = new ClassPathResource(backFilePath);        BufferedImage bi = ImageIO.read(resource.getInputStream());

"java zxing怎么合成复杂二维码图片"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

二维 二维码 图片 文字 字体 背景 系统 背景图片 生成 问题 大小 宋体 画布 测试 宽度 底部 知识 开发 操作系统 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库起名规范 移动软件开发与安全课程论文 广州吴虹软件开发有限公司 服务器与设备管理器 互联网科技创新大赛获奖作品 将ip转化为域名的服务器 计算机网络技术是专科吧 逆战测试服连接服务器登录不进去 网络安全知识的重要性 联合国数据库怎么使用 营销数据库与数据仓库是什么关系 软件开发工具详细设计说明书 区委网信办网络安全培训学校 网络安全正确姿势 申请了星团长换服务器还能用吗 网络安全民法典观后感 北京安防守时模块服务器虚拟主机 语句还原数据库 郑州定制冷库软件开发 山东网络技术有限公司 澳洲服务器是哪个 数据库操作系统入门书籍 计算机网络技术是专科吧 网络安全信息工程师什么时候考 重庆hp服务器阵列卡安装云主机 大数据库系统服务方案 大学毕业软件开发 数据库修改设计后怎么保存 牡丹江软件开发培训中心 网络安全设备销售员
0