Java 生成二维码

Posted 认真对待世界的小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 生成二维码相关的知识,希望对你有一定的参考价值。

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形。

二维条码也有许多不同的码制,码制的编码原理而言,通常分为三种类型

  • 线性堆叠式二维码
  • 矩阵式二维码
  • 邮政码

线性堆叠式二维码

编码原理:建立在一维条码基础之上,按需要堆积成两行或多行。

矩阵式二维码

在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”

邮政码

邮政码通过不同长度的条进行编码,主要用于邮件编码,如:POSTNET、BPO 4-STATE。

二维码的优缺点

优点

  • 高密度编码,信息容量大
  • 编码范围广
  • 容错能力强
  • 译码可靠性高
  • 可引入加密措施
  • 成本低,易制作,持久耐用

缺点

  • 二维码技术成为手机病毒、钓鱼网站传播的新渠道
  • 信息泄露

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

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

QR code 比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势。

QR code 是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是 Quick Response Code。

纠错能力

  • L级:约可纠错7%的数据码字
  • M级:约可纠错15%的数据码字
  • Q级:约可纠错25%的数据码字
  • H级:约可纠错30%的数据码字

JSP生成二维码方法

  • 借助第三方jar,如zxing和qrcodejar
  • javascript,如jquery.qrcode.js

使用zxing生成二维码

GitHub地址,猛戳:https://github.com/zxing/zxing

API文档,猛戳:https://zxing.github.io/zxing/apidocs/index.html

介绍文档,猛戳:https://zxing.github.io/zxing/

第一步:引入jar包

可以通过下载源码自己编译生成jar包,也可以通过maven依赖

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

第二步:生成二维码的代码 

package com.jwen.imooc.zxing;

import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class CreateQRCode {

    public static void main(String[] args) {
        int width = 300;
        int height = 300;
        String format = "png";
        String contents = "www.baidu.com";
        
        // 定义二维码的参数
        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(contents, BarcodeFormat.QR_CODE, width, height, hints);
        
            Path path = new File("C:/Users/jwen/Desktop/img.png").toPath();
            
            MatrixToImageWriter.writeToPath(bitMatrix, format, path);
        
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

第三步:读取二维码的代码

public class ReadQRCode {

    public static void main(String[] args) {
        try {
            MultiFormatReader formatReader = new MultiFormatReader();

            File file = new File("C:/Users/jwen/Desktop/img.png");

            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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

使用qrcode生成二维码

生成:http://www.swetake.com/qrcode/index-e.html

读取:https://osdn.jp/projects/qrcode/

第一步:下载引入jar包

 

 

第二步:生成二维码的代码 

package com.jwen.imooc.qrcode;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;

public class CreateQRCode {
    public static void main(String[] args) throws Exception {
        int version = 7;

        Qrcode x = new Qrcode();
        x.setQrcodeErrorCorrect(\'M\');// 纠错等级
        x.setQrcodeEncodeMode(\'B\');// N代表数字,A代表a-Z,B代表其他字符
        x.setQrcodeVersion(version);// 版本
        String qrDate = "www.baidu.com";

        int width = 67 + 12 + (version - 1);
        int height = 67 + 12 + (version - 1);
        File file = new File("C:/Users/jwen/Desktop/img2.png");

        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics2D gs = bufferedImage.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.setColor(Color.BLACK);
        gs.clearRect(0, 0, width, height);

        int pixoff = 2;// 偏移量

        byte[] d = qrDate.getBytes("gb2312");
        if (d.length > 0 && d.length < 120) {
            boolean[][] s = x.calQrcode(d);

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

        gs.dispose();
        bufferedImage.flush();

        ImageIO.write(bufferedImage, "png", file);
    }
}

第三步:读取二维码的代码

package com.jwen.imooc.qrcode;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;

public class CreateQRCode {
    public static void main(String[] args) throws Exception {
        int version = 7;

        Qrcode x = new Qrcode();
        x.setQrcodeErrorCorrect(\'M\');// 纠错等级
        x.setQrcodeEncodeMode(\'B\');// N代表数字,A代表a-Z,B代表其他字符
        x.setQrcodeVersion(version);// 版本
        String qrDate = "www.baidu.com";

        int width = 67 + 12 + (version - 1);
        int height = 67 + 12 + (version - 1);
        File file = new File("C:/Users/jwen/Desktop/img2.png");

        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics2D gs = bufferedImage.createGraphics();
        gs.setBackground(Color.WHITE);
        gs.setColor(Color.BLACK);
        gs.clearRect(0, 0, width, height);

        int pixoff = 2;// 偏移量

        byte[] d = qrDate.getBytes("gb2312");
        if (d.length > 0 && d.length < 120) {
            boolean[][] s = x.calQrcode(d);

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

            }
        }

        gs.dispose();
        bufferedImage.flush();

        ImageIO.write(bufferedImage, "png", file);

    }

}

 

package com.jwen.imooc.qrcode;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class MyQRCodeImage implements QRCodeImage {

    BufferedImage bufferedImage;

    public MyQRCodeImage(BufferedImage bufferedImage) {
        this.bufferedImage = bufferedImage;
    }

    @Override
    public int getHeight() {
        return bufferedImage.getHeight();
    }

    @Override
    public int getPixel(int arg0, int arg1) {
        return bufferedImage.getRGB(arg0, arg1);
    }

    @Override
    public int getWidth() {
        return bufferedImage.getWidth();
    }

}

注意:此方式本人解析时报错,尚未解决:Invalid number of Finder Pattern detected

 

 

 

前端生成二维码的方式有 jquery.qrcode,此处不赘述

 

以上是关于Java 生成二维码的主要内容,如果未能解决你的问题,请参考以下文章

利用java代码生成二维码

java 生成二维码后如何给该二维码添加信息

java使用qcord生成的二维码,手机可以扫,扫描枪扫不出来,或者很难扫出来?

java二维码生成与解析代码实现

java生成的二维码中间logo怎么改成文字

java 生产二维码报错