zxing是Google的一个专门用于编、解二维码,条形码的开源项目,使用和操作都很方便。zxing不尽支持Java而且还支持其他比如Android、cpp、C#、iPhone、j2me、j2se、jruby、objc、rim、symbian等多种应用的类库。自己可以根据需要添加所需类库。本篇文章参考了http://www.open-open.com/lib/view/open1345039836522.html中的部分类型。
第一步:在Google的官网 http://code.google.com/p/zxing/下载zxing的类库,下载后将其解压。压缩文件盒解压的文件以及解压文件的文件目录如下:
zxing类库文件
第二步:将 zxing-master\core\src\main\java 目录下和 zxing-master\javase\src\main\java 目录下所有文件拷贝你的项目当中。
此时你的项目结构如下图所示:
由于zxing的类库比较多,有时可能和自己的package混淆。此时有两种选择:一是就在当前工程中开发自己的项目,自己的包创建时和zxing类库区别明显;二是将该包打包成jar文件,另外创建一个工程来开发自己的项目,只要将打包的jar文件拷贝到新创建的工程中即可。
这里我们采用第二种方法,即将工程打包成jar文件。利用Eclipse自带的打包工具可以将工程打包成jar文件。具体步骤如下:
1、右击项目 选择 ---》Export
2、选择 Java->JAR file
3、点击下一步,选择jar文件的放置路径,并选择相关的选项,如下图:
4、点击finish,到指定的路径下将jar文件拷贝你的项目中。
第三步:二维码的编码和解码,示例代码如下:
package com.xie.qrcode;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
public class QrZxing {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
/**二维码生成**/
/**二维码内容**/
String content = "小孩,hello zxing" ;
/**内容的格式,如果有中文的话必须转码,**/
content = new String(content.getBytes("UTF-8"), "ISO-8859-1") ;
/**二维码图片的保存路径**/
String imagePath = "D:\\qrCode.jpg" ;
File file = new File(imagePath) ;
/**构造二维码,宽高分别为200、200**/
QRCodeWriter writer = new QRCodeWriter() ;
BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, 200, 200) ;
MatrixToImageWriter.writeToFile(matrix, "jpg", file);
//------------------------------------------------------------------------>
/**二维码解析**/
QRCodeReader reader = new QRCodeReader();
/**获取二维码图片对象**/
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source );
BinaryBitmap imageBinaryBitmap = new BinaryBitmap(binarizer);
Result result = reader.decode(imageBinaryBitmap);
System.out.println("result = "+ result.toString());
System.out.println("resultFormat = "+ result.getBarcodeFormat());
System.out.println("resultText = "+ result.getText());
}
}
生成的二维码:
二维码解析的结果如下:
条形码的编码、解码和二维码的编码、解码相似,这里只贴出其代码。
package com.xie.qrcode;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
public class BarCode {
/** 条形码编码 **/
public void encode(String contents, int width, int height, String imgPath) {
int codeWidth = 3 +(7 * 6) + 5 +(7 * 6) + 3;
codeWidth = Math.max(codeWidth, width);
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
BarcodeFormat.EAN_13, codeWidth, height, null);
MatrixToImageWriter
.writeToFile(bitMatrix, "png", new File(imgPath));
} catch (Exception e) {
e.printStackTrace();
}
}
/** 条形码解码 **/
public String decode(String imgPath) {
BufferedImage image = null;
Result result = null;
try {
image = ImageIO.read(new File(imgPath));
if (image == null) {
System.out.println("the decode image may be not exit.");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
result = new MultiFormatReader().decode(bitmap, null);
return result.getText();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
/** 编码 **/
String imgPath = "d:/zxing_EAN13.png";
// 益达无糖口香糖的条形码
String contents = "6923450657713";
int width = 105, height = 50;
BarCode barCode = new BarCode();
barCode.encode(contents, width, height, imgPath);
/** 解码 **/
String decodeContent = barCode.decode(imgPath);
System.out.println("解码内容如下:");
System.out.println(decodeContent);
}
}