java平台产生二维码和解析二维码的列子(一)

2014-11-23 21:43:32 · 作者: · 浏览: 38
一:介绍一下二维码

二维码的特点:

1. 高密度编码,信息容量大

可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。

2. 编码范围广

该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。

3. 容错能力强,具有纠错功能

这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。

4. 译码可靠性高

它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。

5. 可引入加密措施

保密性、防伪性好。

6. 成本低,易制作,持久耐用

正因为以上这些特点,二维码现在越来越流行,应用也是越来越广



二:二维码的原理
\

如上图时一个qrcode的基本结构,其中:
位置探测图形、位置探测图形分隔符、定位图形:用于对二维码的定位,对每个QR码来说,位置都是固定存在的,只是大小规格会有所差异;
校正图形:规格确定,校正图形的数量和位置也就确定了;
格式信息:表示改二维码的纠错级别,分为L(7%)、M(15%)、Q(25%)、H(30%);


三:二维码的使用


所需jar包:QRCode.jar

1.1 二维码API

public class TwoDimensionCode {

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param imgPath 图片路径

*/

public void encoderQRCode(String content, String imgPath) {

this.encoderQRCode(content, imgPath, "png", 7);

}

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param output 输出流

*/

public void encoderQRCode(String content, OutputStream output) {

this.encoderQRCode(content, output, "png", 7);

}

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param imgPath 图片路径

* @param imgType 图片类型

*/

public void encoderQRCode(String content, String imgPath, String imgType) {

this.encoderQRCode(content, imgPath, imgType, 7);

}

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param output 输出流

* @param imgType 图片类型

*/

public void encoderQRCode(String content, OutputStream output, String imgType) {

this.encoderQRCode(content, output, imgType, 7);

}

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param imgPath 图片路径

* @param imgType 图片类型

* @param size 二维码尺寸

*/

public void encoderQRCode(String content, String imgPath, String imgType, int size) {

try {

BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

File imgFile = new File(imgPath);

// 生成二维码QRCode图片

ImageIO.write(bufImg, imgType, imgFile);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 生成二维码(QRCode)图片

* @param content 存储内容

* @param output 输出流

* @param imgType 图片类型

* @param size 二维码尺寸

*/

public void encoderQRCode(String content, OutputStream output, String imgType, int size) {

try {

BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

// 生成二维码QRCode图片

ImageIO.write(bufImg, imgType, output);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 生成二维码(QRCode)图片的公共方法

* @param content 存储内容

* @param imgType 图片类型

* @param size 二维码尺寸

* @return

*/

private BufferedImage qRCodeCommon(String content, String imgType, int size) {

BufferedImage bufImg = null;

try {

Qrcode qrcodeHandler = new Qrcode();

// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小

qrcodeHandler.setQrcodeErrorCorrect('M');

qrcodeHandler.setQrcodeEncodeMode('B');

// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大

//,也象征着二维码的信息容量;二维码可以看成一个黑白方格矩阵,版本不同,矩阵长宽 //方向方格的总数量分别不同,版本1为21*21矩阵,版本每增1,二维码的两个边长都增4;所以版本//7为45*45的矩阵;最高版本为是40,是177*177的矩阵;

qrcodeHandler.setQrcodeVersion(size);

// 获得内容的字节数组,设置编码格式

byte[] contentBytes = content.getBytes("utf-8");

// 图片尺寸

int imgSize = 67 + 12 * (size - 1);

bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);

Graphics2D gs = bufImg.createGraphics();

// 设置背景颜色

gs.setBackground(Color.WHITE);

gs.clearRect(0, 0, imgSize, imgSize);

// 设定图像颜色> BLACK

gs.setColor(Color.BLACK);

// 设置偏移量,不设置可能导致解析出错

int pixoff = 2;

// 输出内容> 二维码

if (contentBytes.length > 0 && contentByte