二维码Encode Decode Demo

本帖演示代码由junboqi@cn.ibm.com原创,转载请注明出处,谢谢。

1. 二维码第三方包下载地址,该第三方包由日本QRCode开源组织提供:
[URL]http://pan.baidu.com/s/1gdrHcrh[/URL]

2. 演示代码下载地址(作者原创):
[url]http://pan.baidu.com/s/1jGGD2q6[/url]

[img]http://dl2.iteye.com/upload/attachment/0100/9406/fdeef756-0d01-3e34-b674-8e1b02c41dce.png[/img]

3 源代码清单说明:
解码器:输入二维码图像数据,或者包含二维码图像数据的InputStream,输出解析好的字符数据。
[b]EnhancedQRCodeDecoder.java[/b]
编码器:输入字符串,编码成二维码图像数据,可以根据自己的喜好保存成任意图片格式。
[b]QRCodeEncoder.java[/b]
实现第三方接口标准的默认二维码图像类。
[b]QRCodeImageDefult.java[/b]
编码解码演示。
[b]QRCodeDemo.java[/b]
一个图形化界面,可以调整各自参数的二维码演示,考虑到内容较多,读者可以点击上方的下载地址,自行下载运行。内含源代码zip包。
[b]qrcodeDemo.jar[/b]
[b]QRCodeUI.java[/b]

4.部分源代码明细
[b]EnhancedQRCodeDecoder.java[/b]

package home.ibm.tony.qrcode;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;
import jp.sourceforge.qrcode.exception.DecodingFailedException;

public class EnhancedQRCodeDecoder extends QRCodeDecoder {

public byte[] decode(InputStream input) throws DecodingFailedException,
IOException {
QRCodeImageDefult image = new QRCodeImageDefult(ImageIO.read(input));
return super.decode(image);
}

public String decodeToString(QRCodeImage qrCodeImage)
throws DecodingFailedException, UnsupportedEncodingException {
return new String(super.decode(qrCodeImage), "utf-8");

}

public String decodeToString(InputStream input) throws DecodingFailedException, IOException {
return new String(decode(input));
}
}


[b]QRCodeEncoder.java[/b]
package home.ibm.tony.qrcode;

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

import com.swetake.util.Qrcode;

public class QRCodeEncoder {

private Color bgColor;
private Qrcode configure;
private Color fgColor;
private int margin;
private int pixelSize;



public QRCodeEncoder() {
setDefault();
bgColor = Color.WHITE;
fgColor = Color.BLACK;
pixelSize = 5;
margin = 2;
}

public BufferedImage encode(String content) throws UnsupportedEncodingException {

if(content == null || content.length() == 0 || content.length() > 256)
{
content = "http://ieqq.iteye.com/blog/2114077";
}
byte[] bstr = content.getBytes("UTF-8");
boolean[][] result = new boolean[0][0];
result = configure.calQrcode(bstr);
int imageSize = result.length * pixelSize + margin * 2;

BufferedImage bi = new BufferedImage(imageSize, imageSize,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setBackground(bgColor); // 背景颜色
g.clearRect(0, 0, imageSize, imageSize);
g.setColor(fgColor); // 条码颜色

for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result.length; j++) {
if (result[j][i]) {
g.fillRect(j * pixelSize + margin, i * pixelSize + margin,
pixelSize, pixelSize);
}
}
}

g.dispose();
bi.flush();

return bi;

}

public Color getBgColor() {
return bgColor;
}

public Qrcode getConfigure() {
return configure;
}

public char getErrorCorrect() {
return configure.getQrcodeErrorCorrect();
}

public Color getFgColor() {
return fgColor;
}

public int getMargin() {
return margin;
}

public int getPixelSize() {
return pixelSize;
}

public int getVersion() {
return configure.getQrcodeVersion();
}

public void setBgColor(Color bgColor) {
this.bgColor = bgColor;
}

public void setConfigure(Qrcode configure) {
this.configure = configure;
}

protected void setDefault() {
configure = new Qrcode();
// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
configure.setQrcodeErrorCorrect('M');
configure.setQrcodeEncodeMode('B');
// 设置设置二维码版本号,取值范围1-40,值越大尺寸越大,可存储的信息越大
configure.setQrcodeVersion(3);
}

public void setErrorCorrect(char errorCorrect) {
this.configure.setQrcodeErrorCorrect(errorCorrect);
}

public void setFgColor(Color fgColor) {
this.fgColor = fgColor;
}

public void setMargin(int margin) {
this.margin = margin;
}

public void setPixelSize(int pixelSize) {
this.pixelSize = pixelSize;
}

public void setVersion(int version) {
this.configure.setQrcodeVersion(version);
}

}


[b]QRCodeImageDefult.java[/b]

package home.ibm.tony.qrcode;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class QRCodeImageDefult implements QRCodeImage {

private BufferedImage image;

public QRCodeImageDefult() {
}

public QRCodeImageDefult(BufferedImage image) {
this.image = image;
}

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

public BufferedImage getImage() {
return image;
}

public int getPixel(int x, int y) {
return image.getRGB(x, y);
}

public int getWidth() {

return image.getWidth();
}

public void setImage(BufferedImage image) {
this.image = image;
}

}



[b]QRCodeDemo.java[/b]


package home.ibm.tony.qrcode.test;

import home.ibm.tony.qrcode.EnhancedQRCodeDecoder;
import home.ibm.tony.qrcode.QRCodeEncoder;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

public class QRCodeDemo {

public static void main(String[] args) throws IOException {
String imgPath = "c:/z.png";
String encoderContent = "http://ieqq.iteye.com/";

QRCodeEncoder encoder = new QRCodeEncoder();

ImageIO.write(encoder.encode(encoderContent), "png", new File(imgPath));

System.out.println("done!");

EnhancedQRCodeDecoder decoder = new EnhancedQRCodeDecoder();
String decoderContent = decoder.decodeToString(new FileInputStream(
new File(imgPath)));
System.out.println("解析结果如下:");
System.out.println(decoderContent);

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值