使用Zxing生成二维码,以及在生成的二维码中添加logo
public static void main(String[] args) {try {int width = 200;int height = 200;String content = "http://www.taobao.com";BitMatrix matrix = MatrixToImageWriterEx.createQRCode(content, width, height);MatrixToLogoImageConfig logoConfig = new MatrixToLogoImageConfig(Color.BLUE, 4);MatrixToImageWriterEx.writeToFile(matrix, "jpg", "C:/img/imgQRCode.jpg", "C:/img/logo.jpg", logoConfig);System.out.println("生成二维码结束!");} catch (Exception e) {e.printStackTrace();}}
?
?
?
MatrixToImageWriterEx.java : 生成二维码logo扩展类,此类是在zxing的基础上进行扩展的,用于在二维码上定制自己的logo
package com.demo.zxing;import java.awt.BasicStroke;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Hashtable;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.client.j2se.MatrixToImageConfig;import com.google.zxing.client.j2se.MatrixToImageWriter;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class MatrixToImageWriterEx {private static final MatrixToLogoImageConfig DEFAULT_CONFIG = new MatrixToLogoImageConfig();/** * 根据内容生成二维码数据 * @param content 二维码文字内容[为了信息安全性,一般都要先进行数据加密] * @param width 二维码照片宽度 * @param height 二维码照片高度 * @return */public static BitMatrix createQRCode(String content, int width, int height){Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); //设置字符编码 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定纠错等级hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); BitMatrix matrix = null; try { matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); } catch (WriterException e) { e.printStackTrace(); } return matrix;}/** * 写入二维码、以及将照片logo写入二维码中 * @param matrix 要写入的二维码 * @param format 二维码照片格式 * @param imagePath 二维码照片保存路径 * @param logoPath logo路径 * @throws IOException */public static void writeToFile(BitMatrix matrix, String format, String imagePath, String logoPath) throws IOException {MatrixToImageWriter.writeToFile(matrix, format, new File(imagePath), new MatrixToImageConfig());//添加logo图片, 此处一定需要重新进行读取,而不能直接使用二维码的BufferedImage 对象BufferedImage img = ImageIO.read(new File(imagePath));MatrixToImageWriterEx.overlapImage(img, format, imagePath, logoPath, DEFAULT_CONFIG);}/** * 写入二维码、以及将照片logo写入二维码中 * @param matrix 要写入的二维码 * @param format 二维码照片格式 * @param imagePath 二维码照片保存路径 * @param logoPath logo路径 * @param logoConfig logo配置对象 * @throws IOException */public static void writeToFile(BitMatrix matrix, String format, String imagePath, String logoPath, MatrixToLogoImageConfig logoConfig) throws IOException {MatrixToImageWriter.writeToFile(matrix, format, new File(imagePath), new MatrixToImageConfig());//添加logo图片, 此处一定需要重新进行读取,而不能直接使用二维码的BufferedImage 对象BufferedImage img = ImageIO.read(new File(imagePath));MatrixToImageWriterEx.overlapImage(img, format, imagePath, logoPath, logoConfig);}/** * 将照片logo添加到二维码中间 * @param image 生成的二维码照片对象 * @param imagePath 照片保存路径 * @param logoPath logo照片路径 * @param formate 照片格式 */public static void overlapImage(BufferedImage image, String formate, String imagePath, String logoPath, MatrixToLogoImageConfig logoConfig) {try {BufferedImage logo = ImageIO.read(new File(logoPath));Graphics2D g = image.createGraphics();//考虑到logo照片贴到二维码中,建议大小不要超过二维码的1/5;int width = image.getWidth() / logoConfig.getLogoPart();int height = image.getHeight() / logoConfig.getLogoPart();//logo起始位置,此目的是为logo居中显示int x = (image.getWidth() - width) / 2;int y = (image.getHeight() - height) / 2;//绘制图g.drawImage(logo, x, y, width, height, null);//给logo画边框//构造一个具有指定线条宽度以及 cap 和 join 风格的默认值的实心 BasicStrokeg.setStroke(new BasicStroke(logoConfig.getBorder()));g.setColor(logoConfig.getBorderColor());g.drawRect(x, y, width, height);g.dispose();//写入logo照片到二维码ImageIO.write(image, formate, new File(imagePath));} catch (Exception e) {e.printStackTrace();}}}
?
MatrixToLogoImageConfig.java : 定制logo属性类
?
package com.demo.zxing;import java.awt.Color;public class MatrixToLogoImageConfig {//logo默认边框颜色public static final Color DEFAULT_BORDERCOLOR = Color.RED;//logo默认边框宽度public static final int DEFAULT_BORDER = 2;//logo大小默认为照片的1/5public static final int DEFAULT_LOGOPART = 5;private final int border = DEFAULT_BORDER;private final Color borderColor;private final int logoPart;/** * Creates a default config with on color {@link #BLACK} and off color * {@link #WHITE}, generating normal black-on-white barcodes. */public MatrixToLogoImageConfig() {this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);}public MatrixToLogoImageConfig(Color borderColor, int logoPart) {this.borderColor = borderColor;this.logoPart = logoPart;}public Color getBorderColor() {return borderColor;}public int getBorder() {return border;}public int getLogoPart() {return logoPart;}}
?
?
这基本就是源码了,这里就不贴项目源码了,中国的程序员拿来主义太严重.... 其实还有一些其他的扩展功能.... 这里就不多说了。