package
com.charles.study.barcode.twodimensions;
import
java.awt.image.BufferedImage;
import
java.io.File;
import
java.util.HashMap;
import
java.util.Hashtable;
import
java.util.Map;
import
javax.imageio.ImageIO;
import
com.google.zxing.BarcodeFormat;
import
com.google.zxing.BinaryBitmap;
import
com.google.zxing.DecodeHintType;
import
com.google.zxing.EncodeHintType;
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;
import
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
/**
* 这个工具类用于处理编码/解码 二维码
* @author charles.wang
*
*/
public
class
TwoDimensionCodeUtil {
private
TwoDimensionCodeUtil(){}
/**
* 基于一个字符串生成相对应的QR二维码,有指定的宽度和高度,并且存放到指定位置的文件中
* @param contents
* @param width
* @param height
* @param fileName
* @throws Exception
*/
public
static
void
generate2DBarCodeImage(String contents ,
int
width,
int
height,String fileName)
throws
Exception{
Hashtable hints=
new
Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
hints.put(EncodeHintType.CHARACTER_SET,
"utf-8"
);
BitMatrix bitMetrix =
new
MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,hints);
String fileFormat = fileName.substring(fileName.lastIndexOf(
"."
)+
1
,fileName.length());
File outputFile =
new
File(fileName);
MatrixToImageWriter.writeToFile(bitMetrix,fileFormat,outputFile);
}
/**
* 读取一个QR二维码图片文件,还原其原始信息
* @param imagePath
* @return
*/
public
static
String resolve2DBarCodeImage(String imagePath){
BufferedImage image =
null
;
try
{
image = ImageIO.read(
new
File(imagePath));
if
(image ==
null
) {
System.out.println(
"二维码图片不存在."
);
}
LuminanceSource source =
new
BufferedImageLuminanceSource(image);
BinaryBitmap bitmap =
new
BinaryBitmap(
new
HybridBinarizer(source));
Map<DecodeHintType,String> hints =
new
HashMap<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET,
"utf-8"
);
Result result =
new
MultiFormatReader().decode(bitmap,hints);
return
result.getText();
}
catch
(Exception e) {
e.printStackTrace();
}
return
null
;
}
public
static
void
main(String [] args){
try
{
String qr_contents=
"Charles的二维码范例"
;
int
qr_width =
200
;
int
qr_height=
200
;
generate2DBarCodeImage(qr_contents,qr_width,qr_height,
"D:/Framework Study/BarCode/TwoDimensions/newQRcode.png"
);
}
catch
(Exception ex){
System.err.print(
"生成二维码出错"
);
}
String qr_original = resolve2DBarCodeImage(
"D:/Framework Study/BarCode/TwoDimensions/newQRcode.png"
);
System.out.println(
"还原的信息为:"
+qr_original);
}
}