`

使用Zxing生成二维码,以及在生成的二维码中添加logo

 
阅读更多

     最近研究了Zxing的源码,以及它的一些常用的用法,感触也是很深,也提高了不少,网上也找了各种写法,要真正的理解这一整套东西还是要花费些经历的,涉及的知识面还是有一些的,下面就上一下我简单封装的源码。以方便大家做参考,封装的不完善,只是简单的写了个,大家可以自己进行封装.....

1. 下载Zxing所需要的依赖包:core-2.2.jar、javase-2.2.jar ,因为只使用到了javase-2.2 Jar包的部分内容,可以将javase进行简化下

ZxingDemoTest.java:  测试入口类

 

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 风格的默认值的实心 BasicStroke
			g.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/5
	public 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;
	}
}

 

 

这基本就是源码了,这里就不贴项目源码了,中国的程序员拿来主义太严重.... 其实还有一些其他的扩展功能.... 这里就不多说了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics