需要的jar包有:core.jar和zxing-javase.jar
其中:zxing-javase.jar包中的MatrixToImageWriter类在不同版本的jdk环境下编译后打成的jar包在不匹配的jdk中可能会报错,所以直接用其源代码:
MatrixToImageWriter.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import com.google.zxing.common.BitMatrix;
public class MatrixToImageWriter {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private MatrixToImageWriter() {}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}
QRCodeUtil.java
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
public class QRCodeUtil {
public static void main(String[] args) {
QRCodeUtil codeUtil=new QRCodeUtil();
String str = "http://blog.youkuaiyun.com/lzghxjt";
String path = "F:/QRCode.jpg";
codeUtil.encode(str, path);
codeUtil.decode(path);
}
/*
* 编码:
* 第1步:将内容转换成二维矩阵
* 第2步:将二维矩阵转换成图片
* */
public void encode(String str, String path) {
try {
BitMatrix byteMatrix;
//将文字转换成二维矩阵,并设置矩阵大小,这里的矩阵大小就是后面生成的图片像素大小
byteMatrix = new MultiFormatWriter().encode(new String(str.getBytes("UTF-8"),"UTF-8"), BarcodeFormat.QR_CODE, 800, 800);
File file = new File(path);
//将矩阵文件转换成图片文件
MatrixToImageWriter.writeToFile(byteMatrix, "jpg", file);
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 解码:
* 第1步:将图片反解码为二维矩阵
* 第2步:将该二维矩阵解码为内容
* */
public void decode(String imgPath) {
try {
File file = new File(imgPath);//获取该图片文件
BufferedImage image;
try {
image = ImageIO.read(file);
if (image == null) {
System.out.println("不能解析该二维码");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();//将图片反解码为二维矩阵
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
result = new MultiFormatReader().decode(bitmap, hints);//将该二维矩阵解码成内容
String resultStr = result.getText();
System.out.println("解码结果:"+resultStr);
} catch (IOException ioe) {
System.out.println(ioe.toString());
} catch (ReaderException re) {
System.out.println(re.toString());
}
} catch (Exception ex) {
System.out.println(ex.toString());
}
}
}
本示例中编码生成的二维码是:
用微信扫后可自动跳转到本博客。