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

来源:互联网 发布:无法安装java 编辑:程序博客网 时间:2024/06/01 09:13
二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“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;    }}

测试:
这里写图片描述

原创粉丝点击