Java生成解析二维码

Java生成二维码

一、介绍

1. 理解二维码

黑点代表二进制中的1,白点代表二进制中的0,通过1和0的排列组合,在二维空间记录数据。通过图像输入设备,读取其中的内容。

2. 二维码分类

二维码有不同的码制,就码制的编码原理而言,通常分为三种类型:

  • 线性堆叠式二维码

建立在一维条码的基础之上,按需要堆叠成两行或多行。

  • 矩阵式二维码

最常用的类型。在一个矩阵空间通过黑、白像素在矩阵中的不同分布进行编码。

  • 邮政码

通过不同长度的条进行编码,主要用于邮政编码。

二、 QR Code

目前流行的三大国际标准:

  • PDF417:不支持中文
  • DM:专利未公开,需支付专利费用
  • QR Code:专利公开,支持中文

JSP生成二维码的方法:

  • 借助第三方 jar,如 zxingqrcodejar
  • JavaScript,如 jquery.qrcode.js

三、 jar 包

jar 包下载地址:

在这里已经整理好了二维码所需资源

四、 使用 zxing 生成解析二维码

### 1. 使用前配置 先来看一下解压后文件夹的目录:

core 文件夹是核心文件夹,里面包含使用二维码技术的 .java 文件。

javase 文件夹里面也包含了生成图片等功能的 .java 文件。

可是文件夹里面不含 jar 包,可以使用 eclipse 或 Intellij idea 等 IDE 手动打包,这里整理好了 jar 包资源

2. 生成二维码

/** 生成二维码 */
public class CreateQRCode {
    public static void main(String[] args) {
        /** 二维码大小 */
        int width = 300;
        int height = 300;
        /** 二维码格式 */
        String format = "png";
        /** 二维码内容 */
        String content = "https://github.com/seriouszyx";

        /**
         *  定义二维码参数
         *
         *  CHARACTER_SET           编码类型
         *  ERROR_CORRECTION        纠错等级
         *      L < M < Q < H  纠错能力越高,可存储的越少
         *  MARGIN                  边距
         **/
        HashMap hints = new HashMap();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        hints.put(EncodeHintType.MARGIN, 2);

        /** 生成二维码 */
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
            Path file = new File("F:/img.png").toPath();
            MatrixToImageWriter.writeToPath(bitMatrix, format, file);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
随后在F盘目录下即可看到 `img.png` 图片

通过微信等扫描二维码,可以看到其中的内容。

3. 解析二维码

下面我们自己创造解析二维码的方法

/** 读取二维码 */
public class ReadQRCode {
    public static void main(String[] args) {
        MultiFormatReader formatReader = new MultiFormatReader();
        File file = new File("F:/img.png");
        try {
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
            HashMap hints = new HashMap();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            Result result = formatReader.decode(binaryBitmap, hints);

            System.out.println("解析结果: " + result.toString());
            System.out.println("二维码的格式类型:" + result.getBarcodeFormat());
            System.out.println("二维码文本内容: " + result.getText() );
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
运行程序,控制台输出二维码对应的信息

四、 使用 QRCode 生成解析二维码

这里整理了 QRCode 的 jar 包资源,其中 A 为二维码生成 jar 包, B 为二维码解析 jar 包。

1. 生成二维码

这里慕课网视频中的代码有问题,二层循环中的 i 和 j 顺序相反,导致解析代码解析后会产生一连串的数字,下面是修改后的代码:

public class CreateQRCode {
    public static void main(String[] args) throws Exception {
        /** jar 包核心类 */
        Qrcode x = new Qrcode();
        /** 纠错等级 */
        x.setQrcodeErrorCorrect('M');
        /** N 代表数字,A 代表a-Z,B 代表其他字符 */
        x.setQrcodeEncodeMode('B');
        /** 版本号 1-40 */
        x.setQrcodeVersion(7);
        /** 二维码内容 */
        String qrData = "https://github.com/seriouszyx";
        /** 二维码尺寸 */
        int width = 300;
        int height = 300;

        /** 设置图片缓冲区 */
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        /** 依靠Java画图工具 */
        Graphics2D gs = bufferedImage.createGraphics();
        /** 设置画板相关属性 */
        gs.setBackground(Color.white);
        gs.setColor(Color.black);
        gs.clearRect(0, 0, width, height);

        /** 偏移量,不加可能导致解析出错 */
        int pixoff = 2;


        byte[] d = qrData.getBytes("gb2312");
        if (d.length > 0 && d.length < 120) {
            /** 将内容通过 QRCode 对象转化成二维数组 */
            boolean[][] s = x.calQrcode(d);

            for (int i=0; i<s.length; i++) {
                for (int j=0; j<s.length; j++) {
                    if (s[i][j]) {
                        gs.fillRect(i*3+pixoff, j*3+pixoff, 3, 3);
                    }
                }
            }
        }

        /** 绘制结束 */
        gs.dispose();
        bufferedImage.flush();

        /** 输出图片到指定路径 */
        ImageIO.write(bufferedImage, "png", new File("F:/qrcode.png"));
    }
}

这时生成的二维码似乎与我们想象中的有些不同,主要是因为宽和高的设置有问题,这里需要用公式计算尺寸

        int width = 67 + 12 * (7 - 1);
        int height = 67 + 12 * (7 - 1);
成功生成二维码!

2. 解析二维码

public class ReadQRCode {
    public static void main(String[] args) throws Exception {
        /** 将图片读取到缓冲区 */
        File file = new File("F:/qrcode.png");
        BufferedImage bufferedImage = ImageIO.read(file);

        /** 将缓冲区信息封装传递给 QRCodeDecoder */
        QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
        String result =
                new String(qrCodeDecoder.decode(new MyQRCodeImage(bufferedImage)), "gb2312");
        System.out.println(result);
    }
}
解析结果:

五、 使用 jquery-qrcode 生成二维码

建立 javaweb 工程,导入 js 文件(注意引入顺序),新建 jsp 文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>qrcode</title>
    <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.min.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery.qrcode.min.js"></script>
</head>
<body>
    生成的二维码如下:<br>
    <div id="qrcode"></div>

<script>
    jQuery('#qrcode').qrcode('https://github.com/seriouszyx')
</script>
</body>
</html>
运行服务器,打开 jsp 页面

GitHub 地址:github.com/seriouszyx

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java生成二维码可以使用第三方库ZXing(Zebra Crossing)。ZXing是一个开源的用于生成解析二维码的库,它支持多种编程语言,包括Java。 首先,我们需要导入ZXing库。你可以从ZXing的官方网站下载最新的jar包,然后将其添加到Java项目的类路径下。 接下来,我们可以使用ZXing提供的编码类来生成二维码。以下是一个简单的示例代码: ``` import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; public class QRCodeGenerator { public static void main(String[] args) { String text = "Hello, World!"; // 需要编码成二维码的文本 int width = 300; // 二维码图片的宽度 int height = 300; // 二维码图片的高度 String format = "png"; // 二维码图片的格式 // 设置二维码的参数 java.util.Map<EncodeHintType, Object> hints = new java.util.HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 使用ZXing生成二维码 BitMatrix bitMatrix; try { bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); } catch (WriterException e) { e.printStackTrace(); return; } // 将BitMatrix转换为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) ? 0xFF000000 : 0xFFFFFFFF); } } // 保存生成二维码图片 try { ImageIO.write(image, format, new File("qrcode." + format)); System.out.println("二维码生成"); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码演示了如何使用ZXing库生成一个简单的二维码。你可以将需要编码的文本、图片的宽度和高度以及保存的文件格式替换为你所需的值。最终生成二维码将被保存为一个文件。 需要注意的是,运行此代码时必须确保Java项目的类路径中已经包含了ZXing库的jar文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隐秀_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值