基于zxing生成与解析二维码、条形码
生活随笔
收集整理的這篇文章主要介紹了
基于zxing生成与解析二维码、条形码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ?基于zxing(https://github.com/zxing/zxing)與maven,針對二維碼(包括帶圖片的二維碼)、條形碼進行了簡單的封裝,以便在項目中更好的利用。
? ??ZXing是一個開源Java類庫用于解析多種格式的1D/2D條形碼。目標是能夠?qū)R編碼、Data Matrix、UPC的1D條形碼進行解碼。 其提供了多種平臺下的客戶端包括:J2ME、J2SE和Android
? ? ?關(guān)于二維碼的生成細節(jié)與原理,請參考:http://coolshell.cn/articles/10590.html
package com.qrcode;import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; 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.WriterException; 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;public class PRUtil {// 圖片寬度的一般private static final int IMAGE_WIDTH = 80;private static final int IMAGE_HEIGHT = 80;private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;private static final int FRAME_WIDTH = 2;/*** 生成普通二維碼* * @param contents* @param width* @param height* @param imgPath*/public static void encodePR(String contents, int width, int height, String imgPath) {Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();// 指定糾錯等級hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 指定編碼格式hints.put(EncodeHintType.CHARACTER_SET, "GBK");try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,BarcodeFormat.QR_CODE, width, height, hints);MatrixToImageWriter.writeToStream(bitMatrix, "jpg",new FileOutputStream(imgPath));} catch (Exception e) {e.printStackTrace();}}/*** 生成帶圖片的二維碼* * @param content* @param width* @param height* @param srcImagePath* @param destImagePath*/public static void encodePR(String content, int width, int height,String srcImagePath, String destImagePath) {try {ImageIO.write(genBarcode(content, width, height, srcImagePath),"jpg", new File(destImagePath));} catch (IOException e) {e.printStackTrace();} catch (WriterException e) {e.printStackTrace();}}/*** 針對二維碼進行解析* * @param imgPath* @return*/public static String decodePR(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 exists.");}LuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "GBK");result = new MultiFormatReader().decode(bitmap, hints);return result.getText();} catch (Exception e) {e.printStackTrace();}return null;}/*** 創(chuàng)建條形碼* * @param contents* @param width* @param height* @param imgPath*/public static void encodeBar(String contents, int width, int height, String imgPath) {// 條形碼的最小寬度int codeWidth = 98;codeWidth = Math.max(codeWidth, width);try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,BarcodeFormat.EAN_13, codeWidth, height, null);MatrixToImageWriter.writeToStream(bitMatrix, "png",new FileOutputStream(imgPath));} catch (Exception e) {e.printStackTrace();}}/*** 針對條形碼進行解析* * @param imgPath* @return*/public static String decodeBar(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;}/*** 把傳入的原始圖像按高度和寬度進行縮放,生成符合要求的圖標* * @param srcImageFile 源文件地址* @param height 目標高度* @param width 目標寬度* @param hasFiller 比例不對時是否需要補白:true為補白; false為不補白;* @throws IOException*/private static BufferedImage scale(String srcImageFile, int height, int width,boolean hasFiller) throws IOException {double ratio = 0.0; // 縮放比例File file = new File(srcImageFile);BufferedImage srcImage = ImageIO.read(file);Image destImage = srcImage.getScaledInstance(width, height,BufferedImage.SCALE_SMOOTH);// 計算比例if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {if (srcImage.getHeight() > srcImage.getWidth()) {ratio = (new Integer(height)).doubleValue()/ srcImage.getHeight();} else {ratio = (new Integer(width)).doubleValue()/ srcImage.getWidth();}AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);destImage = op.filter(srcImage, null);}if (hasFiller) {// 補白BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);Graphics2D graphic = image.createGraphics();graphic.setColor(Color.white);graphic.fillRect(0, 0, width, height);if (width == destImage.getWidth(null))graphic.drawImage(destImage, 0,(height - destImage.getHeight(null)) / 2,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);elsegraphic.drawImage(destImage,(width - destImage.getWidth(null)) / 2, 0,destImage.getWidth(null), destImage.getHeight(null),Color.white, null);graphic.dispose();destImage = image;}return (BufferedImage) destImage;}/*** 產(chǎn)生帶有圖片的二維碼緩沖圖像* @param content* @param width* @param height* @param srcImagePath* @return* @throws WriterException* @throws IOException*/private static BufferedImage genBarcode(String content, int width, int height,String srcImagePath) throws WriterException, IOException {// 讀取源圖像BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,IMAGE_HEIGHT, true);int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];for (int i = 0; i < scaleImage.getWidth(); i++) {for (int j = 0; j < scaleImage.getHeight(); j++) {srcPixels[i][j] = scaleImage.getRGB(i, j);}}Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();hint.put(EncodeHintType.CHARACTER_SET, "GBK");hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 生成二維碼MultiFormatWriter mutiWriter = new MultiFormatWriter();BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,width, height, hint);// 二維矩陣轉(zhuǎn)為一維像素數(shù)組int halfW = matrix.getWidth() / 2;int halfH = matrix.getHeight() / 2;int[] pixels = new int[width * height];for (int y = 0; y < matrix.getHeight(); y++) {for (int x = 0; x < matrix.getWidth(); x++) {// 讀取圖片if (x > halfW - IMAGE_HALF_WIDTH&& x < halfW + IMAGE_HALF_WIDTH&& y > halfH - IMAGE_HALF_WIDTH&& y < halfH + IMAGE_HALF_WIDTH) {pixels[y * width + x] = srcPixels[x - halfW+ IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];}// 在圖片四周形成邊框else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH- IMAGE_HALF_WIDTH + FRAME_WIDTH)|| (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH&& x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH&& y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH+ IMAGE_HALF_WIDTH + FRAME_WIDTH)) {pixels[y * width + x] = 0xfffffff;} else {// 此處可以修改二維碼的顏色,可以分別制定二維碼和背景的顏色;pixels[y * width + x] = matrix.get(x, y) ? 0xff000000: 0xfffffff;}}}BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);image.getRaster().setDataElements(0, 0, width, height, pixels);return image;}public static void main(String[] args) {String imgPath = "d:/pr1.jpg";String contents = "你好,李四! welcome to zxing!"+ "\n李四的博客[http://my.oschina.net/cloudcoder]"+ "\nEmail[xxx@163.com]";// 普通二維碼的生成與解析PRUtil.encodePR(contents, 300, 300, imgPath);System.out.println("生成二維碼成功");System.out.println(PRUtil.decodePR(imgPath));// 帶圖片的二維的生成與解析imgPath = "d:/pr2.png";String srcPath = "d:/src.jpg";PRUtil.encodePR(contents, 300, 300, srcPath,imgPath);System.out.println("生成帶圖片的二維碼成功");System.out.println(PRUtil.decodePR(imgPath));// 條形碼的生成與解析imgPath = "d:/bar.png";PRUtil.encodeBar("6923450657713", 105, 50, imgPath);System.out.println("生成條形碼成功");System.out.println(PRUtil.decodeBar(imgPath));} }pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.test</groupId><artifactId>qrcode</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>qrcode</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.0.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies> </project>總結(jié)
以上是生活随笔為你收集整理的基于zxing生成与解析二维码、条形码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Webstorm常用快捷键备忘(Webs
- 下一篇: ignite学习笔记