使用 zxing 生成二维码以及条形码

目录

需求背景

前期在做项目的时候,有一个需求是说要生成一张条形码,并且呢将条形码插入到 excel 中去,但是之前一直没有搞过找个条形码或者是二维码,最后是做出来了,这里呢就先看看怎么生成,后面再抽时间来写写怎么实现条形码插入到 excel 中去。

开始搭建

引入对应的 zxing 依赖包

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.4.1</version>
</dependency>

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.4.1</version>
</dependency>

条形码生成与读取

这里呢,我就不赘述太多了,因为这个就是一个工具类,设置好对应的参数,执行指定的方法就可以了,比较简单,具体的生成代码以及读取条形码的代码如下:

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

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

public class BarCodeUtils {

    /**
     * generateCode 根据code生成相应的一维码
     *
     * @param file   一维码目标文件
     * @param code   一维码内容
     * @param width  图片宽度
     * @param height 图片高度
     */
    public static void generateCode(File file, String code, int width, int height) {
        //定义位图矩阵BitMatrix
        BitMatrix matrix = null;
        try {
            // 使用code_128格式进行编码生成100*25的条形码
            MultiFormatWriter writer = new MultiFormatWriter();

            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

            //定义编码参数 这里可以设置条形码的格式
            matrix = writer.encode(code, BarcodeFormat.CODE_128, width, height, hints);
            //matrix = writer.encode(code,BarcodeFormat.EAN_13, width, height, hints);
        } catch (WriterException e) {
            e.printStackTrace();
        }

        //将位图矩阵BitMatrix保存为图片
        try (FileOutputStream outStream = new FileOutputStream(file)) {
            assert matrix != null;
            ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix), "png", outStream);
            outStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * readCode 读取一张一维码图片
     *
     * @param file 一维码图片名字或者是文件路径
     */
    public static void readCode(File file) {
        try {
            BufferedImage image = ImageIO.read(file);
            if (image == null) {
                return;
            }
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            Map<DecodeHintType, Object> hints = new HashMap<>();
            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
            hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

            Result result = new MultiFormatReader().decode(bitmap, hints);
            System.out.println("条形码内容: " + result.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        generateCode(new File("D:\\barcode.png"), "123456789012", 500, 250);
        readCode(new File("D:\\barcode.png"));
    }

}

执行下:
执行结果
对应的文件:
对应的文件

二维码生成与读取

上面我们看了下条形码的生成与读取,那么我们来看下二维码怎么生成:

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

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

public class QRCodeUtils {

    //生成二维码
    public static void generateQRCode(String content, int width, int height, String filePath) throws Exception {
        String format = "png";
        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);    // 设置边距

        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        QRCodeUtils.outputQRCode(bitMatrix, format, filePath);
    }

    private static void outputQRCode(BitMatrix matrix, String format, String filePath) throws Exception {
        MatrixToImageWriter.writeToPath(matrix, format, java.nio.file.Paths.get(filePath));
    }


    //读取二维码
    public static void readQrCode(File file) {
        MultiFormatReader reader = new MultiFormatReader();
        try {
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
            Map<DecodeHintType, Object> hints = new HashMap<>();
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");//设置编码
            Result result = reader.decode(binaryBitmap, hints);
            System.out.println("解析结果:" + result.toString());
            System.out.println("二维码格式:" + result.getBarcodeFormat());
            System.out.println("二维码文本内容:" + result.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        String filePath = "D:\\qrcode.png";
        generateQRCode("https://www.baidu.com", 300, 300, filePath);
        readQrCode(new File(filePath));
    }

}

执行下:
执行结果
对应的文件:
对应的二维码文件

支持的格式源码部分

我们可以点击看下源码 BarcodeFormat 类中支持的各种格式,这里是将所有的都给枚举出来了,大家需要用到的时候再具体查看吧

public enum BarcodeFormat {
    AZTEC,
    CODABAR,
    CODE_39,
    CODE_93,
    CODE_128,
    DATA_MATRIX,
    EAN_8,
    EAN_13,
    ITF,
    MAXICODE,
    PDF_417,
    QR_CODE,
    RSS_14,
    RSS_EXPANDED,
    UPC_A,
    UPC_E,
    UPC_EAN_EXTENSION;

    private BarcodeFormat() {
    }
}

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

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

相关文章

6.3 cf 944

Problem - C - Codeforces 思路 分四种情况&#xff0c;以12为分界点 &#xff08;紫色部分是最初思路&#xff0c;但不包含所有情况&#xff09; 只看在a<b c<d 时的图 代码 #include <bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(…

web前端三大主流框架指的是什么

web前端三大主流框架是什么&#xff1f;前端开发师的岗位职责有哪些&#xff1f;这边整理了相关内容供大家参考了解&#xff0c;请各位小伙伴随小编一起查阅下面的内容。 web前端三大主流框架 web前端三大主流框架是Angular、React、Vue。 1.Angular Angular原名angularJS诞生…

OJ3376无尽的石头问题

答案&#xff1a; #include<bits/stdc.h> using namespace std; const int N10e7; int fx(int n) {int sum0;while(n){sum(n%10);n/10;}return sum; } int main() {int t,n,x;cin>>t;while(t--){cin>>n;int count0;for(int i1;i<N;){if(in){cout<<…

网关(Gateway)- 自定义过滤器工厂

自定义过滤工厂类 DemoGatewayFilterFactory package com.learning.springcloud.custom;import org.apache.commons.lang.StringUtils; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChai…

FreeRTOS【16】直达任务通知使用

1.开发背景 直达任务通知&#xff0c;FreeRTOS 的线程任务提供的接口&#xff0c;可以用作线程唤醒&#xff0c;或者是传递数据&#xff0c;因为是基于线程本身的操作&#xff0c;是轻量级&#xff0c;速度响应更快&#xff0c;适合小内存芯片使用。 事实上本人使用得比较少&am…

pytorch笔记:自动混合精度(AMP)

1 理论部分 1.1 FP16 VS FP32 FP32具有八个指数位和23个小数位&#xff0c;而FP16具有五个指数位和十个小数位Tensor内核支持混合精度数学&#xff0c;即输入为半精度&#xff08;FP16&#xff09;&#xff0c;输出为全精度&#xff08;FP32&#xff09; 1.1.1 使用FP16的优缺…

大渡口数字经济产业商会暨尼伽OLED透明屏产品发布会

2024年5月31日&#xff0c;大渡口数字经济产业商会成功举办了一场盛大的“商会数字经济发展项目签约大会”&#xff0c;活动上不仅深入探讨了构建“义渡新质生产力”及如何更好地“建功重庆西部大开发”的战略议题&#xff0c;还正式与尼伽OLED宣布达成战略合作伙伴关系&#x…

Java版工程项目管理系统源码:技术框架与功能实现全解析

在工程行业&#xff0c;项目管理的高效协同和信息共享是提升管理效率和精度的关键。本文将详细介绍一款采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0…

10个从基础到高级的GPT提示词优化指南

为一名大模型的深度用户和微软Copilot的首批开放测试者&#xff0c;很多人会问我如何写出高效的提示词。同时&#xff0c;也有不少读者反映&#xff0c;像ChatGPT和Claude这样的模型并没有想象中那么神奇&#xff0c;无法满足他们的实际需求。 首先我想说&#xff0c;确实像Ch…

双指针_复写零

复写零 题目描述&#xff1a; 题目链接&#xff1a;复写零 内容&#xff1a; 这道题目要求我们每遇到一次0就复写一遍&#xff0c;并且只能在原数组上进行修改&#xff0c;不能越界访问。 算法原理&#xff1a; 思路1&#xff1a; 如果我们用两个指针cur,dest同时从指向第一个…

c# 输出二进制字符串

参考链接 C#二进制输出数据_c# 输出二进制 123.5的方法-CSDN博客https://blog.csdn.net/a497785609/article/details/4572112标准数字格式字符串 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings#BFo…

工业HMI设计,稳定压倒一切,那高颜值就不稳定了吗?

提及工业HMI设计&#xff0c;很多小伙伴就跳出来说&#xff0c;工业 HMI稳定是最重要的&#xff0c;颜值没比必要&#xff0c;花里呼哨的.我承认稳定的重要性&#xff0c;但是稳定与颜值并不是一对矛盾体。本文就分享为什么工业HMI稳定性重要&#xff1f;为什么高颜值也重要&am…

QT:QML中使用Loader加载界面

目录 一.介绍 二.实现 三.效果展示 四.代码 一.介绍 在QML中使用Loader加载界面&#xff0c;可以带来诸多好处&#xff0c;如提高应用程序的启动速度、动态地改变界面内容、根据条件加载不同的组件、更有效地使用内存以及帮助分割应用逻辑等。 1.延迟加载&#xff1a;QML…

动态规划2:面试题 08.01. 三步问题

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;面试…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第34课-进门播放欢迎光临的音效

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第34课-进门播放欢迎光临的音效 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智…

R语言绘图 --- 柱状图(Biorplot 开发日志 --- 3)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形&#xff0c;如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包&#xff08;Biorplot&#xff09;&#xff0c;用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

MWORKS车辆动力性经济性与热管理联合应用篇

一、引言 随着科技的飞速发展、环保意识的日益增强以及国家政策的大力支持&#xff0c;新能源汽车已经不再是遥不可及的未来科技&#xff0c;而是逐步走进千家万户&#xff0c;成为我们日常生活中不可或缺的一部分。然而&#xff0c;每到冬季的来临&#xff0c;纯电动汽车面临…

Linux shell编程学习笔记56:date命令——显示或设置系统时间与日期

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。在收集的信息中&#xff0c;应该有一条是搜索信息的时间。 1. date命令 的功能、格式和选项说明 我们可以使用命令 date --help 来查看 d…

巧用Jmeter Debug sampler获取变量信息

Jmeter Debug sampler介绍 Jmeter Debug sampler 可以帮助我们解决如下问题&#xff1a; debug参数化的变量取值是否正确 debug正则表达式提取器&#xff08;或json提取器&#xff09;提取的值是否正确 查看 JMeter 属性 具体使用方法 前提条件&#xff1a;添加查看结果树…