二維碼的生成和解碼Java實現
涉及到的一些主要類庫,方便大家下載:
- 二維碼編碼lib:Qrcode_swetake.jar(官網介紹 -- http://www.swetake.com/qr/index-e.html)
- 二維碼解碼lib:qrcode.jar (官網介紹 -- http://sourceforge.jp/projects/qrcode/)
java二維碼 生成二維碼 QRCodeEncoderHandler.java
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;
/**
- 二維碼生成器
- @blog http://zhblog.github.com/blog
@author zzh */ public class QRCodeEncoderHandler {
/**
- 生成二維碼(QRCode)圖片
- @param content
@param imgPath */ public void encoderQRCode(String content, String imgPath) { try {
Qrcode qrcodeHandler = new Qrcode(); qrcodeHandler.setQrcodeErrorCorrect('M'); qrcodeHandler.setQrcodeEncodeMode('B'); qrcodeHandler.setQrcodeVersion(7); System.out.println(content); byte[] contentBytes = content.getBytes("utf-8"); BufferedImage bufImg = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); gs.setBackground(Color.cyan); gs.clearRect(0, 0, 140, 140); // 設定圖像顏色 > BLACK gs.setColor(Color.BLACK); // 設置偏移量 不設置可能導致解析出錯 int pixoff = 2; // 輸出內容 > 二維碼 if (contentBytes.length > 0 && contentBytes.length < 120) { boolean[][] codeOut = qrcodeHandler.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); } } } } else { System.err.println("QRCode content bytes length = " + contentBytes.length + " not in [ 0,120 ]. "); } gs.dispose(); bufImg.flush(); File imgFile = new File(imgPath); // 生成二維碼QRCode圖片 ImageIO.write(bufImg, "png", imgFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
@param args the command line arguments */ public static void main(String[] args) { String imgPath = "./zzh.png";
String content = "\t江湖在喝酒的路上"
+ "\nMyblog :http://zhblog.github.com/blog" + "\nEMail :jack.zh.1986@gmail.com" + "\nQQ :715443050";
QRCodeEncoderHandler handler = new QRCodeEncoderHandler(); handler.encoderQRCode(content, imgPath); System.out.println("encoder QRcode success"); } }</pre>
java二維碼解碼 QRCodeDecoderHandler.java
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;
import javax.imageio.ImageIO;
import jp.sourceforge.qrcode.QRCodeDecoder; import jp.sourceforge.qrcode.data.QRCodeImage; import jp.sourceforge.qrcode.exception.DecodingFailedException;
/**
- @blog http://zhblog.github.com/blog
@author zzh */ public class QRCodeDecoderHandler {
/**
- 解碼二維碼
- @param imgPath
@return String */ public String decoderQRCode(String imgPath) {
// QRCode 二維碼圖片的文件 File imageFile = new File(imgPath);
BufferedImage bufImg = null; String decodedData = null; try {
bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); decodedData = new String(decoder.decode(new J2SEImage(bufImg)));
} catch (IOException e) {
System.out.println("Error: " + e.getMessage()); e.printStackTrace();
} catch (DecodingFailedException dfe) {
System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace();
} return decodedData; }
/**
@param args the command line arguments */ public static void main(String[] args) { QRCodeDecoderHandler handler = new QRCodeDecoderHandler(); String imgPath = "zzh.png"; String decoderContent = handler.decoderQRCode(imgPath); System.out.println("解析結果如下:"); System.out.println(decoderContent); System.out.println("========decoder success!!!"); }
class J2SEImage implements QRCodeImage { BufferedImage bufImg;
public J2SEImage(BufferedImage bufImg) {
this.bufImg = bufImg;
}
public int getWidth() {
return bufImg.getWidth();
}
public int getHeight() {
return bufImg.getHeight();
}
public int getPixel(int x, int y) {
return bufImg.getRGB(x, y);
}
} }</pre>