ZXing(google)生成&读取二维码内容 很简单的demo。google的ZXing易用性很高,虽然暂时项目中还没有用到,但学以备用。
2453
2017-03-10
主要示例代码
/**
* @Description
* @company ND Co., Ltd
* @author zys(910204)
* @date 2017年3月10日 下午3:29:37
*/
public class QRCode {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private static final int MARGIN = 1; // 边框
private static final String FORMAT = "png";
private static final String TEXT = "二维码测试";
public static void main(String[] args) throws WriterException, IOException {
System.out.println(Charsets.UTF_8.name());
BitMatrix bitMatrix = createRqCodeMatrix(TEXT, 300, 300);
Path filePath = new File("F:/matrix/qrCode.png").toPath();
MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, filePath);
BufferedImage bufferedImage = createRqCodeImage(TEXT, 800, 800);
applyLogo(bufferedImage);
ImageIO.write(bufferedImage, "png", new File("F:/matrix/qrCode2.png"));
}
/**
*
* @Description 生成二维码比特模型
* @company ND Co., Ltd
* @author zys(910204)
* @date 2017年3月10日 下午3:56:25
* @param content 文本内容
* @param width 宽
* @param height 高
* @return
* @throws WriterException
*/
public static BitMatrix createRqCodeMatrix(String content, int width, int height) throws WriterException {
// 生成二维码的配置项
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
// 容错等级,越高则可存储的内容越少(容错等级即是二维码在部分缺失的情况下其储存数据的可恢复性)
// 通常使用M等级
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
// 内容所使用字符集编码
hints.put(EncodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
// 生成的二维码图片外框边距
hints.put(EncodeHintType.MARGIN, new Integer(MARGIN));
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
return bitMatrix;
}
/**
*
* @Description 生成二维码图片
* @company ND Co., Ltd
* @author zys(910204)
* @date 2017年3月10日 下午3:56:25
* @param content 文本内容
* @param width 宽
* @param height 高
* @return
* @throws WriterException
*/
public static BufferedImage createRqCodeImage(String content, int width, int height) throws WriterException {
// 生成二维码的配置项
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
// 内容所使用字符集编码
hints.put(EncodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
// 通常使用M等级
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 生成的二维码图片外框边距
hints.put(EncodeHintType.MARGIN, new Integer(MARGIN));
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 通过二维码的比特模型生成image
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, bitMatrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
/**
*
* @Description 向二维码中间空白处绘制Logo
* @company ND Co., Ltd
* @author zys(910204)
* @date 2017年3月10日 下午3:56:46
* @param image
* @throws IOException
*/
public static void applyLogo(BufferedImage image) throws IOException {
Graphics2D gs = image.createGraphics();
ClassPathResource resource = new ClassPathResource("logo.png");// logo图片
// 载入logo
Image img = ImageIO.read(resource.getFile());
int left = image.getWidth() / 2 - img.getWidth(null) / 2;
int top = image.getHeight() / 2 - img.getHeight(null) / 2;
gs.drawImage(img, left, top, null);
gs.dispose();
img.flush();
}
/**
*
* @Description 读取二维码文本
* @company ND Co., Ltd
* @author zys(910204)
* @date 2017年3月10日 下午4:23:07
* @param inputFile
* @return
* @throws NotFoundException
* @throws IOException
*/
public static String readQrCode(File inputFile) throws NotFoundException, IOException {
MultiFormatReader formatReader = new MultiFormatReader();
BufferedImage image = ImageIO.read(inputFile);
// 这里的转换需要注意下
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
// 读取二维码的配置项
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
// 内容所使用字符集编码
hints.put(DecodeHintType.CHARACTER_SET, Charsets.UTF_8.name());
Result result = formatReader.decode(bitmap, hints);
return result.getText();
}
}
Maven依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>