First, we need the package google-zxing-core-3.2.1.jar, google-zxing-javase-3.2.1.jar custom version is not supported on another version
effect
Steps: logo.png zoom, draw two-dimensional code, generated picture
Tools:
package com.demo.web.common; 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.IOException; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; public class QRcodeUtil { // 图片宽度的一般 private static final int IMAGE_WIDTH = 50; private static final int IMAGE_HEIGHT = 50; private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2; private static final int FRAME_WIDTH = 2; // 二维码写码器 private static MultiFormatWriter mutiWriter = new MultiFormatWriter(); public static void encode(String content, int width, int height, String srcImagePath, String destImagePath) { try { ImageIO.write(genBarcode(content, width, height, srcImagePath), "png", new File(destImagePath)); } catch (IOException e) { e.printStackTrace(); } catch (WriterException e) { e.printStackTrace(); } } 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); } } // set the level of the two-dimensional code error correction coding the Map <EncodeHintType, Object> = hint new new the HashMap <EncodeHintType, Object> (); hint.put (EncodeHintType.CHARACTER_SET, "UTF -8 " ); hint.put (EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // generate two-dimensional code BitMatrix matrix = mutiWriter.encode (Content, BarcodeFormat.QR_CODE, width, height, hint); // a two-dimensional matrix transpose a one-dimensional array of pixels int halfW matrix.getWidth = () / 2 ; int halfH matrix.getHeight = () / 2 ; int [] = pixelsnew 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 ; } the else { // here can modify the color two-dimensional code, the two-dimensional code can be developed and background color, respectively; pixels [X + Y * width] = matrix.get (X, Y ?) 0xFF000000: 0xFFFFFFF ;0xfffffff } } } The BufferedImage Image = new new the BufferedImage (width, height, BufferedImage.TYPE_INT_RGB); . Image.getRaster () setDataElements to ( 0, 0 , width, height, pixels); return Image; } / ** * the incoming original image icon to zoom by height and width, generated to meet the requirements * * @param srcImageFile source address * @param height target height * @param width target width * @param hasFiller when the ratio does not need padding: true for the padding; false is not padding; * IOException * / Private @throws 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); else graphic.drawImage(destImage, (width - destImage.getWidth(null)) / 2, 0, destImage.getWidth(null), destImage.getHeight(null), Color.white, null); graphic.dispose(); destImage = image; } return (BufferedImage) destImage; } public static void main(String[] args) { //将1.png作为logo放在2.png中间 生成扫码图片2.png变成二维码 QRcodeUtil.encode("http://www.baidu.com", 300, 300, "D:/1.png", "D:/2.png"); System.out.println ("Success!" ); } }