/**  
* <p>Title: QRCodeUtil.java</p>  
* <p>Description: </p>  
* @author dsc  
* @date 2020年4月28日  
* @version 1.0  
*/
package cn.timer.api.utils.QRCode;

import java.awt.image.BufferedImage;
import java.io.File;
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.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;;

/**
 * <p>
 * Title: QRCodeUtil.java
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author dsc
 * @date 2020年4月28日
 * @version 1.0
 */

public class ZXingUtil {
	/**
	 * @param imgPath 保存路径
	 * @param format 图片格式
	 * @param content 保存内容
	 * @param width 宽
	 * @param height 高
	 * @param logo logo图片路径
	 * @throws Exception
	 */
	public static void encodeImg(String imgPath, String format, String content, int width, int height, String logo)
			throws Exception {
		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
		// 排错率 L<M<Q<H
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		// 编码
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		// 外边距:margin
		hints.put(EncodeHintType.MARGIN, 1);
		/*
		 * content : 需要加密的 文字 BarcodeFormat.QR_CODE:要解析的类型(二维码) hints:加密涉及的一些参数:编码、排错率
		 */
		BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
		// 内存中的一张图片:此时需要的图片 是二维码-> 需要一个boolean[][] ->BitMatrix
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		for (int x = 0; x < width; x++) {
			for (int y = 0; y < height; y++) {
				image.setRGB(x, y, (bitMatrix.get(x, y) ? 0 : 16777215)); // TODO
			}
		}
		// 画logo
		image = LogoUtil.logoMatrix(image, logo);
		// string->file
		File file = new File(imgPath);
		// 生成图片
		ImageIO.write(image, format, file);
	}

	/*
	 * public static void main(String[] args) { String imgPath =
	 * "C:\\Users\\Lenovo\\Desktop\\8timer.png"; String content = "8timer.cn";
	 * String logo = "C:\\Users\\Lenovo\\Pictures\\Saved Pictures\\生气.jpg"; //
	 * 加密:文字信息->二维码 try { ZXingUtil.encodeImg(imgPath, "png", content, 430, 430,
	 * logo); } catch (Exception e) { e.printStackTrace(); } }
	 */

}