Java实现二维码的生成与识别

二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。

所需要的jar包
QRcode.jar

二维码图片类 QrcodeImg.java

package qrcode;

import jp.sourceforge.qrcode.data.QRCodeImage;

import java.awt.image.BufferedImage;

/**
 * Created by zf on 2017/6/12.
 */
public class QrcodeImg implements QRCodeImage {

    private BufferedImage bufImg = null;

    public QrcodeImg(BufferedImage bufImg) {
        this.bufImg = bufImg;
    }

    public int getWidth() {
        return bufImg.getWidth();
    }

    public int getHeight() {
        return bufImg.getHeight();
    }

    public int getPixel(int i, int i1) {
        return bufImg.getRGB(i, i1);
    }
}

二维码生成类 ImgEncoder.java

package qrcode;

import com.swetake.util.Qrcode;

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

/**
 * Created by zf on 2017/6/12.
 */
public class ImgEncoder {

    private int width = 140;//图片宽
    private int height = 140;//图片长
    private String imgPath = "D:\\qrcode.png";//图片保存位置

    public ImgEncoder() {
    }

    public ImgEncoder(int width, int height, String imgPath) {
        this.width = width;
        this.height = height;
        this.imgPath = imgPath;
    }

    public boolean generate(String content) {
        try {
            Qrcode qrcode = new Qrcode();
            // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
            qrcode.setQrcodeErrorCorrect('Q');
            qrcode.setQrcodeEncodeMode('B');
            // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
            qrcode.setQrcodeVersion(7);
            //设置图片尺寸
            BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //绘制二维码图片
            Graphics2D gs=bufImg.createGraphics();
            //设置二维码背景颜色
            gs.setBackground(Color.WHITE);
            //创建一个矩形区域
            gs.clearRect(0, 0, width, height);
            //设置二维码的图片颜色值 黑色
            gs.setColor(Color.BLACK);
            // 获得内容的字节数组,设置编码格式
            byte[] contentBytes = content.getBytes("utf-8");
            // 设置偏移量,不设置可能导致解析出错
            int pixoff = 2;
            //输出二维码
            if (contentBytes.length > 0 && contentBytes.length < 400) {
                boolean[][] codeOut = qrcode.calQrcode(contentBytes);
                for (int i = 0; i < codeOut.length; i++) {
                    for (int j = 0; j < codeOut.length; j++) {
                        if (codeOut[j][i]) {
                            gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
                        }
                    }
                }
            }
            gs.dispose();
            bufImg.flush();
            //生成二维码图片
            File img = new File(imgPath);
            if (img.exists()) {
                img.delete();
            }
            ImageIO.write(bufImg, "png", img);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}

二维码识别类 ImgDecoder.java

package qrcode;

import jp.sourceforge.qrcode.QRCodeDecoder;

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

/**
 * Created by zf on 2017/6/12.
 */
public class ImgDecoder {
    public static String decode(String imgPath) {
        String content = "error";
        try {
            File img = new File(imgPath);
            BufferedImage bufImg = ImageIO.read(img);
            QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
            content = new String(qrCodeDecoder.decode(new QrcodeImg(bufImg)), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content;
    }
}

测试:
Java实现二维码的生成与识别_第1张图片

你可能感兴趣的:(二维码)