Java实现二维码、条形码生成器

文章目录


前言

在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。无论您是想为您的产品添加QR码功能,还是为您的移动应用程序添加扫描功能,本文将为您提供一个清晰的指南。


1、介绍QR码和ZXing

QR码,全名Quick Response码,是一种二维码(2D barcode)的类型,最早由日本公司Denso Wave于1994年开发。它是一种能够存储各种数据类型的矩阵二维条码,通常以黑色模块和白色背景的方式呈现。QR码可以存储文本、URL、联系信息、地理位置等多种信息,因此在移动设备、广告传播、商品标识等领域广泛使用。

ZXing,全名为"Zebra Crossing",是一个开源的Java库,用于二维码的生成和解析。它是一个强大的工具,可以用于生成QR码以及解析包括QR码在内的多种二维码格式。ZXing提供了多种编程语言的API,使开发者能够轻松集成二维码功能到他们的应用中。它支持多种平台,包括Android、iOS、Java等。除了QR码,ZXing还支持解析其他一维码和二维码,例如EAN、UPC、DataMatrix等。

使用ZXing库,你可以轻松地将QR码功能集成到你的软件开发项目中,无论是生成QR码以供分享,还是解析QR码以获取其中的信息。在实际使用中,你可以添加注释来解释代码中的关键部分,以帮助其他开发者理解你的实现。这对于团队协作和维护代码非常有帮助。

2、整合zxing

2.1 pom添加ZXing依赖

        <!-- 二维码 ZXing -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.5.1</version> <!-- 请使用最新版本 -->
        </dependency>

请注意,上述示例中的version部分可以根据你的项目需要使用ZXing的特定版本。建议使用最新版本以获取最新的功能和改进。

2.2 生成二维码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * 生成二维码工具类
 */
@Slf4j
public class CodeGeneratorUtil {

    /**
     * 生成QR码
     *
     * @param data     要存储在QR码中的数据,可以是文本、URL等
     * @param width    QR码的宽度(像素)
     * @param height   QR码的高度(像素)
     * @param filePath 生成的QR码文件的保存路径
     */
    public static void generateQrCode(String data, int width, int height, String filePath) {
        try {
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 错误纠正级别
            hints.put(EncodeHintType.MARGIN, 1); // 二维码边距

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);

            // 创建BufferedImage对象来表示QR码
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
                }
            }

            // 将QR码保存到文件
            File qrCodeFile = new File(filePath);
            ImageIO.write(image, "png", qrCodeFile);
            log.info("QR码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("QR码生成失败:{}", e.getMessage());
        }
    }

   
}

在上面的代码中,generateQRCode方法接收四个参数:

  • data:要存储在QR码中的数据,可以是文本、URL等。

  • width:QR码的宽度(像素)。

  • height:QR码的高度(像素)。

  • filePath:生成的QR码文件的保存路径。

方法使用ZXing库的MultiFormatWriter来生成QR码,并将QR码保存到指定路径的文件中。确保根据你的需求修改这些参数以生成你想要的QR码。

2.3 生成条形码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * 生成二维码工具类
 */
@Slf4j
public class CodeGeneratorUtil {

    /**
     * 生成QR码
     *
     * @param data     要存储在QR码中的数据,可以是文本、URL等
     * @param width    QR码的宽度(像素)
     * @param height   QR码的高度(像素)
     * @param filePath 生成的QR码文件的保存路径
     */
    public static void generateQrCode(String data, int width, int height, String filePath) {
        try {
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 错误纠正级别
            hints.put(EncodeHintType.MARGIN, 1); // 二维码边距

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);

            // 创建BufferedImage对象来表示QR码
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
                }
            }

            // 将QR码保存到文件
            File qrCodeFile = new File(filePath);
            ImageIO.write(image, "png", qrCodeFile);
            log.info("QR码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("QR码生成失败:{}", e.getMessage());
        }
    }

    /**
     * 生成条形码
     *
     * @param data     要存储在条形码中的数据,可以是商品条形码等
     * @param width    条形码的宽度(像素)
     * @param height   条形码的高度(像素)
     * @param filePath 生成的条形码文件的保存路径
     */
    public static void generateBarCode(String data, int width, int height, String filePath) {
        try {
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.CODE_128, width, height, hints);

            // 创建BufferedImage对象来表示条形码
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? 0 : 0xFFFFFF); // 生成黑色条和白色背景的条形码
                }
            }

            // 检查图片是否存在,若不存在则创建
            File barcodeFile = new File(filePath);

            // 将条形码写入
            ImageIO.write(image, "png", barcodeFile);
            log.info("条形码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("条形码生成失败:{}", e.getMessage());
        }
    }

}

2.4 测试结果

写一个测试的main方法:

    public static void main(String[] args) {

        String data = "Hello World";// 内容

        int width1 = 150;// QR码宽度
        int height1 = 150;// QR码高度
        String filePath1 = "C:\\Users\\admin\\Desktop\\QR码.png";// QR码存放路径

        int width2 = 500;// 条形码宽度
        int height2 = 100;// 条形码高度
        String filePath2 = "C:\\Users\\admin\\Desktop\\条形码.png";// 条形码存放路径

        generateQrCode(data, width1, height1, filePath1);
        generateBarCode(data, width2, height2, filePath2);
    }

生成成功,且都可以扫码识别哦!

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

【现代密码学】笔记5--伪随机置换(分组加密)《introduction to modern cryphtography》

【现代密码学】笔记5--伪随机置换&#xff08;分组加密&#xff09;《introduction to modern cryphtography》 写在最前面5 伪随机排列实践构造&#xff08;块密码/分组密码&#xff09; 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&…

Vue-15、Vue条件渲染

1、v-show 在Vue中&#xff0c;v-show是一个指令&#xff0c;用于根据表达式的值来控制元素的显示与隐藏。当指令的值为true时&#xff0c;元素显示&#xff1b;当指令的值为false时&#xff0c;元素隐藏。 v-show的用法如下&#xff1a; <!DOCTYPE html> <html lan…

新手做抖音小店如何选品?选什么样的品?这几点一定要记住

大家好&#xff0c;我是电商花花。 抖音小店如何选品&#xff1f;大家应该自己的选品方法和渠道&#xff0c;但是选品归根结底就是抓住用户的喜好&#xff0c;清楚他们想要什么样的商品&#xff0c;只有抓住用户的需求&#xff0c;客户才会买单&#xff0c;店铺才会出单。 所…

HTML 列表 iframe

文章目录 列表无序列表有序列表自定义列表 iframe 引入外部页面 列表 列表 是 装载 结构 , 样式 一致的 文字 或 图表 的容器 ; 列表 由于其 整齐 , 整洁 , 有序 的特征 , 类似于表格 , 但是其 组合的自由程度高于表格 , 经常用来进行布局 ; HTML 列表包括如下类型 : 无序列…

FASTQ 文件压缩格式有哪些?

FASTQ 文件压缩格式 .gz .bz2 .xz .rfq .rfq.xz FASTQ 文件是用于存储测序数据的一种格式&#xff0c;它包含了大量的文本信息&#xff0c;因此通常占用大量的存储空间。为了有效地处理和传输这些数据&#xff0c;通常需要对 FASTQ 文件进行压缩来节省存储空间及传输带宽。以下…

2024年软件测试五大趋势预测,软件测试服务商价值凸显

当今软件的高速发展对软件质量提出了更高的要求&#xff0c;而软件测试作为保证软件质量的关键环节&#xff0c;自然也成为业界关注的焦点。进入2024年&#xff0c;回顾中国软件测试的发展历程&#xff0c;我们不难发现中国市场日趋成熟&#xff0c;软件测试行业蓬勃发展&#…

vue3中,vue-echarts基本使用(柱状图、饼图、折线图)

注意&#xff1a;vue-echarts在使用前要先安装echarts&#xff0c;不要只安装vue-echarts这一个 echarts官网地址&#xff1a;Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xf…

如何设计一个低代码平台?

导语&#xff1a;如果企业想自主可控&#xff0c;从零开发一个低代码平台&#xff0c;如何技术选型&#xff1f;这篇文章或许会对你有所帮助。 一、前言 低代码平台至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件&#xff0c;我们没必要重新造轮…

pve虚拟机的改名和修改ID

PVE的虚拟机名字在web界面是无法修改id和名字的。要注意id和名字不能重。 在使用备份时就发现虚拟机是以虚拟机id作为维一标识&#xff0c;如果有多台pve节点&#xff0c;但共用同一个nfs目录备份或使用同一个pbs进行备份时就必须保障id的唯一性。这时可以使用这个方法来进行补…

在线培训系统开发

随着远程学习和数字化教育的兴起&#xff0c;在线培训系统成为了教育领域的重要组成部分。在这篇文章中&#xff0c;我们将探讨在线培训系统开发的一些关键技术和概念。 前端开发 在在线培训系统中&#xff0c;前端开发起着至关重要的作用。使用现代的前端框架如React、Vue或…

node-red实现ModBus-RTU 通信协议(RS485信号输出)的数据交互

node-red实现485型 - 温湿度变表数据转换 一、介绍二、 通讯协议2.1 通讯基本参数2.2 数据帧格式定义2.3 寄存器地址2.4 通讯协议示例以及解释 三、 node-red实现数据交互3.1 node-red读取数据3.2 node-red写回数据 本文参考《86 壳液晶温湿度变送器使用说明书&#xff08;485 …

jetlinks 规则编排中的函数节点使用 js 脚本格式化输出当前系统时间的坑

网上搜到的都是类似如下这种&#xff1a; // 获取当前时间 var date new Date();// 格式化输出当前时间 var year date.getFullYear(); var month date.getMonth(); var day date.getDate(); var hour date.getHours(); var minute date.getMinutes(); var second date.…

定制聚四氟乙烯反应容器可配套温度计套管和冷凝管

是谁遇到氟化氢就头疼&#xff0c;是谁看着玻璃装置被强碱性试剂折腾的惨不忍睹。 特氟龙塑料材质可以帮您解决问题&#xff0c;聚四氟乙烯材质是其中的一种材质&#xff0c;耐温250℃&#xff0c;耐受强酸强碱和各种有机溶剂&#xff0c;加工灵活&#xff0c;来样或者图纸或者…

线性代数基础【4】线性方程组

第四章 线性方程组 一、线性方程组的基本概念与表达形式 二、线性方程组解的基本定理 定理1 设A为mXn矩阵,则 (1)齐次线性方程组AX0 只有零解的充分必要条件是r(A)n; (2)齐次线性方程组AX0 有非零解(或有无数个解)的充分必要条件是r(A)&#xff1c;n 推论1 设A为n阶矩阵,则…

Matlab论文插图绘制模板第135期—隐函数曲面图(fimplicit3)

在之前的文章中&#xff0c;分享了Matlab隐函数折线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下隐函数曲面图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋友可以关…

html5+css3+bootstrap+js 新闻网页

新闻网页练习打卡&#xff01; 一、首页 二、社会 三、财经 四、视频展示 简易新闻网站&#xff08;期末作业&#xff09;

使用WAF防御网络上的隐蔽威胁之SSRF攻击

服务器端请求伪造&#xff08;SSRF&#xff09;攻击是一种常见的网络安全威胁&#xff0c;它允许攻击者诱使服务器执行恶意请求。与跨站请求伪造&#xff08;CSRF&#xff09;相比&#xff0c;SSRF攻击针对的是服务器而不是用户。了解SSRF攻击的工作原理、如何防御它&#xff0…

在众多的材质中选择灰口铸铁铸造划线平台、铸铁平台等的原因——河北北重

使用灰口铸铁制作铸铁平台和划线平台的主要原因有以下几点&#xff1a; 强度高&#xff1a;灰口铸铁具有较高的强度和硬度&#xff0c;能够承受较大的载荷和冲击力。这使得灰口铸铁非常适合制作需要承受重压和磨损的平台和设备。 耐磨性好&#xff1a;灰口铸铁具有较高的耐磨性…

C++结合OpenCV:图像的加法运算

一、图像运算 针对图像的加法运算、位运算都是比较基础的运算。但是&#xff0c;很多复杂的图像处理功能正是借助这些基础的运算来完成的。所以&#xff0c;牢固掌握基础操作&#xff0c;对于更好地实现图像处理是非常有帮助的。本章简单介绍了加法运算、位运算&#xff0c;并…