Java实现二维码QRCode的编码和解码

来源:互联网 发布:算法导论 中文版 epub 编辑:程序博客网 时间:2024/05/22 15:15

涉及到的一些主要类库,方便大家下载:
编码lib:Qrcode_swetake.jar (官网介绍– http://www.swetake.com/qr/index-e.html)
解码lib:qrcode.jar (官网介绍– http://sourceforge.jp/projects/qrcode/)

一、编码:
QRCodeEncoderHandler.java
Java代码
package michael.qrcode;

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://sjsky.iteye.com
* @author Michael
*/
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.WHITE);         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 = "D:/test/twocode/Michael_QRCode.png";     String content = "JAVA的魅力!"             + "\n要好好学!]"             + "\n加油!" ;     QRCodeEncoderHandler handler = new QRCodeEncoderHandler();     handler.encoderQRCode(content, imgPath);     System.out.println("encoder QRcode success"); } 

}
运行后生成的二维码图片如下:
这里写图片描述

用手机扫描后的结果如下图所示:
这里写图片描述

二、解码:
QRCodeDecoderHandler.java
Java代码
package michael.qrcode;

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://sjsky.iteye.com
* @author Michael
*/
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)));         // try {         // System.out.println(new String(decodedData.getBytes("gb2312"),         // "gb2312"));         // } catch (Exception e) {         // // TODO: handle exception         // }     } 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 = "d:/test/twocode/Michael_QRCode.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);     } } 

}
运行结果如下(解码出的内容和之前输入的内容一致 ):
解析结果如下:
JAVA的魅力!
要好好学!
加油!
========decoder success!!!

0 0