使用google的zxing生成二維碼
阿新 • • 發佈:2019-01-07
二維碼,又叫二維條碼。
1.java這邊的話生成二維碼有很多開發的jar包如 zxing,qrcode ,下面是使用zxing的開發包來實現的。
ZXing專案是google code上面提供的一個關於條碼編解碼的開源專案。
2.先下載zxing開發包,這裡用到的只是core的jar包
我在專案中使用的core2.2.jar包。
下載地址:http://download.csdn.net/download/tvcctv27tv/6841023
注:網上下載的core.jar使用JDK1.5;core2*.jar包使用JDK1.6;core3*.jar使用JDK1.7;
3. 原始碼
package com.test.qrcodes; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Hashtable; import javax.imageio.ImageIO; import junit.framework.Assert; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; public class TestQRCodes { private static final boolean NEEDCOMPRESS = false; private static String LOGO_URL; // LOGO寬度 private static final int WIDTH = 60; // LOGO高度 private static final int HEIGHT = 60; static{ LOGO_URL = "";// 測試圖片路徑地址 } /** * 生成二維碼的工具類 * * @param data * 二維碼中攜帶的資料 * @param width * 二維碼的寬度 * @param height * 二維碼的高度 * @return 返回base64格式的圖片(data:image/gif;base64,xxxx) <br> * eg: <code> * <img alt="" src="data:image/gif;base64,xxxx"> * </code> */ public static String createQRCode(String data, int width, int height, String isPicture) { Assert.assertTrue("param data cannot empty.", data != null && data.trim().length() > 0); Assert.assertTrue("param width and height must gt 0.", width > 0 && height > 0); ByteArrayOutputStream bos = null; MultiFormatWriter formatWriter = new MultiFormatWriter(); Hashtable<EncodeHintType, Object> param = new Hashtable<EncodeHintType, Object>(); param.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q); param.put(EncodeHintType.CHARACTER_SET, "utf-8"); param.put(EncodeHintType.MARGIN, 0); try{ BitMatrix bitMatrix = formatWriter .encode(data, BarcodeFormat.QR_CODE, width, height, param); // 1.1去白邊 int[] rec = bitMatrix.getEnclosingRectangle(); int resWidth = rec[2] + 1; int resHeight = rec[3] + 1; BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); resMatrix.clear(); for (int i = 0; i < resWidth; i++){ for (int j = 0; j < resHeight; j++){ if (bitMatrix.get(i + rec[0], j + rec[1])){ resMatrix.set(i, j); } } } int width1 = resMatrix.getWidth(); int height1 = resMatrix.getHeight(); BufferedImage qrcode = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width1; x++){ for (int y = 0; y < height1; y++){ qrcode.setRGB(x, y, resMatrix.get(x, y) == true ? Color.BLACK.getRGB() : Color.WHITE .getRGB()); } } // 新增logo圖片 if (StringUtils.isNotEmpty(LOGO_URL) && StringUtils.isNotEmpty(isPicture)){ insertImage(width1, qrcode, LOGO_URL, NEEDCOMPRESS); } bos = new ByteArrayOutputStream(); ImageIO.write(qrcode, "png", bos); String img = StringUtils.deleteWhitespace(Base64.encodeBase64String(bos.toByteArray())); return String.format("data:image/png;base64,%s", img); } catch (Exception e){ throw new RuntimeException(e); } finally{ if (bos != null){ try{ bos.close(); } catch (IOException e){ } } } } private static void insertImage(int QRCODE_SIZE, BufferedImage source, String imgPath, boolean needCompress) throws Exception { File file = new File(imgPath); if (!file.exists()){ System.err.println("" + imgPath + " 該檔案不存在!"); return; } Image src = ImageIO.read(new File(imgPath)); int width = src.getWidth(null); int height = src.getHeight(null); if (needCompress){ // 壓縮LOGO if (width > WIDTH){ width = WIDTH; } if (height > HEIGHT){ height = HEIGHT; } Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(image, 0, 0, null); // 繪製縮小後的圖 g.dispose(); src = image; } // 插入LOGO Graphics2D graph = source.createGraphics(); int x = (QRCODE_SIZE - width) / 2; int y = (QRCODE_SIZE - height) / 2; graph.drawImage(src, x, y, width, height, null); // Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); graph.setStroke(new BasicStroke(3f)); // graph.draw(shape); 去除圖片白邊 graph.dispose(); } /** * @param data * 二維碼攜帶的資料 * @param size * 二維碼的寬、高 * @return * @see WechatValidateUtils#generateQRCode(String, int, int) */ public static String createQRCode(String data, int size, String isPicture) { return createQRCode(data, size, size, isPicture); } // 測試 public static void main(String[] args) throws Exception { // 生成二維碼 String url = "http://www.sina.com.cn"; String src = createQRCode(url, 200, "1"); System.out.println(url.length()); String html = "<img src=\"" + src + "\">"; FileOutputStream ops = new FileOutputStream("D:\\QRCodeImage\\test.html"); org.apache.commons.io.IOUtils.write(html, ops, "utf-8"); ops.close(); } }