package com.JUtils.QRCode;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
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.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);
		hints.put(EncodeHintType.MARGIN, 1);
        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 java.io.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 java.io.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 {
			//将logo写入二维码中
			drawImage(logoPath, image, logoConfig);
			
			//写入logo照片到二维码
			ImageIO.write(image, formate, new File(imagePath));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 将照片添加到二维码中间,并生成流
	 * @author:chenming
	 * @date:2014年12月31日
	 *
	 * @param matrix 要写入的二维码
	 * @param formate 照片格式
	 * @param logoPath	要写入照片的路径
	 * @param logoConfig logo配置对象  可以为null,为 null 默认 DEFAULT_CONFIG
	 * @throws java.io.IOException
	 */
	public static void overlapImage(BitMatrix matrix,String formate,String logoPath,MatrixToLogoImageConfig logoConfig,OutputStream out) throws IOException{
		//将matrix转换为bufferImage
		BufferedImage image = MatrixToImageWriter.toBufferedImage(matrix);
		
		//将logo照片绘制到二维码中间
		drawImage(logoPath, image, logoConfig);
		
		//输出
		ImageIO.write(image, formate, out);
	}
	
	/**
	 * 将照片添加到二维码中间,并生成流
	 * @author:chenming
	 * @date:2014年12月31日
	 *
	 * @param image 要写入的二维码
	 * @param formate 照片格式
	 * @param logoPath	要写入照片的路径
	 * @param logoConfig logo配置对象  可以为null,为 null 默认 DEFAULT_CONFIG
	 * @throws java.io.IOException
	 */
	public static void overlapImage(BufferedImage image,String formate,String logoPath,MatrixToLogoImageConfig logoConfig,OutputStream out) throws IOException{
		//将logo照片绘制到二维码中间
		drawImage(logoPath, image, logoConfig);
		
		//输出
		ImageIO.write(image, formate, out);
	}
	
	/**
	 * 将logo添加到二维码中间
	 * @author:chenming
	 * @date:2014年12月31日
	 *
	 * @param logoPath	logo路径
	 * @param image	需要绘制的二维码图片
	 * @param logoConfig	配置参数
	 * @throws java.io.IOException
	 */
	private static void drawImage(String logoPath,BufferedImage image,MatrixToLogoImageConfig logoConfig) throws IOException{
		if(logoConfig == null){
			logoConfig = DEFAULT_CONFIG;
		}
		
		try {
			BufferedImage logo = ImageIO.read(new File(logoPath));
			logo.setRGB(0, 0, BufferedImage.TYPE_INT_BGR);
			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();
		} catch (Exception e) {   //捕捉异常后不做任何处理,防止图片路径错误而导致二维码生成失败
			
		}
	}
	
}
 最近下载更多
最近下载更多
                
                dapeng0011     LV15
                2024年7月5日
            
            
        
                3334004690     LV11
                2024年6月6日
            
            
        
                lee123321     LV22
                2023年12月19日
            
            
        
                初心不负丶方得始终     LV11
                2023年4月21日
            
            
        
                爱情戴罪的羔羊     LV7
                2022年9月17日
            
            
        
                guojun     LV10
                2022年8月17日
            
            
        
                iizuidaima     LV11
                2022年8月11日
            
            
        
                13940562934     LV22
                2022年7月19日
            
            
        
                姜广坤     LV14
                2022年5月20日
            
            
        
                crosa_Don     LV18
                2022年4月1日
            
            
         最近浏览更多
最近浏览更多
                
                ma406805131     LV19
                2024年12月8日
            
            
        
                dapeng0011     LV15
                2024年7月5日
            
            
        
                sky1044     LV1
                2024年2月19日
            
            
        
                lee123321     LV22
                2023年12月19日
            
            
        
                shiaomon    
                2023年12月15日
            
            
                    暂无贡献等级
            
        
                3334004690     LV11
                2023年11月1日
            
            
        
                lilu0226     LV7
                2023年10月29日
            
            
        
                飘逸的云     LV1
                2023年7月6日
            
            
        
                初心不负丶方得始终     LV11
                2023年4月21日
            
            
        
                微信网友_6411404521459712    
                2023年3月30日
            
            
                    暂无贡献等级
            
        
 
                 
                 
                