• 00042-java 生成qrCode


    参数类:

    
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    /**
     * 
     */
    public class QRCodeParams {
    	private String txt; // 二维码内容
    	private String qrCodeUrl; // 二维码网络路径
    	private String logoPath; // logo图片
    	private Integer width = 300; // 二维码宽度
    	private Integer height = 300; // 二维码高度
    	private Integer onColor = 0xFF000000; // 前景色
    	private Integer offColor = 0xFFFFFFFF; // 背景色
    	private Integer margin = 1; // 白边大小,取值范围0~4
    	private ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二维码容错率
    
    	public String getTxt() {
    		return txt;
    	}
    
    	public void setTxt(String txt) {
    		this.txt = txt;
    	}
    
    	public Integer getWidth() {
    		return width;
    	}
    
    	public void setWidth(Integer width) {
    		this.width = width;
    	}
    
    	public Integer getHeight() {
    		return height;
    	}
    
    	public void setHeight(Integer height) {
    		this.height = height;
    	}
    
    	public String getQrCodeUrl() {
    		return qrCodeUrl;
    	}
    
    	public void setQrCodeUrl(String qrCodeUrl) {
    		this.qrCodeUrl = qrCodeUrl;
    	}
    
    	public String getLogoPath() {
    		return logoPath;
    	}
    
    	public void setLogoPath(String logoPath) {
    		this.logoPath = logoPath;
    	}
    
    	public Integer getOnColor() {
    		return onColor;
    	}
    
    	public void setOnColor(Integer onColor) {
    		this.onColor = onColor;
    	}
    
    	public Integer getOffColor() {
    		return offColor;
    	}
    
    	public void setOffColor(Integer offColor) {
    		this.offColor = offColor;
    	}
    
    	public ErrorCorrectionLevel getLevel() {
    		return level;
    	}
    
    	public void setLevel(ErrorCorrectionLevel level) {
    		this.level = level;
    	}
    
    	public Integer getMargin() {
    		return margin;
    	}
    
    	public void setMargin(Integer margin) {
    		this.margin = margin;
    	}
    }
    
    

    图标配置类:

    
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.geom.RoundRectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.URL;
    import java.net.URLConnection;
    
    import javax.imageio.ImageIO;
    /**
    
     */
    public class QRLogoConfig {
    	/**
    	 * 设置 logo
    	 * 
    	 * @param matrixImage
    	 *            源二维码图片
    	 * @return 返回带有logo的二维码图片
    	 * @throws IOException
    	 * @author Administrator sangwenhao
    	 */
    	public BufferedImage LogoMatrix(BufferedImage matrixImage, String logoPath)
    			throws IOException {
    		/**
    		 * 读取二维码图片,并构建绘图对象
    		 */
    		Graphics2D g2 = matrixImage.createGraphics();
    
    		int matrixWidth = matrixImage.getWidth();
    		int matrixHeigh = matrixImage.getHeight();
    
    		int num = logoPath.indexOf('/', 8);
    		String u = logoPath.substring(0, num);
    		URL url = new URL(logoPath);
    		URLConnection connection = url.openConnection();
    		connection.setDoOutput(true);
    		connection.setRequestProperty("referer", u);
    		/**
    		 * 读取Logo图片
    		 */
    		BufferedImage logo = ImageIO.read(connection.getInputStream());
    
    		// 开始绘制图片
    		g2.drawImage(logo, matrixWidth / 5 * 2, matrixHeigh / 5 * 2,
    				matrixWidth / 5, matrixHeigh / 5, null);// 绘制
    		BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND,
    				BasicStroke.JOIN_ROUND);
    		g2.setStroke(stroke);// 设置笔画对象
    		// 指定弧度的圆角矩形
    		RoundRectangle2D.Float round = new RoundRectangle2D.Float(
    				matrixWidth / 5 * 2, matrixHeigh / 5 * 2, matrixWidth / 5,
    				matrixHeigh / 5, 20, 20);
    		g2.setColor(Color.white);
    		g2.draw(round);// 绘制圆弧矩形
    
    		// 设置logo 有一道灰色边框
    		BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND,
    				BasicStroke.JOIN_ROUND);
    		g2.setStroke(stroke2);// 设置笔画对象
    		RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(
    				matrixWidth / 5 * 2 + 2, matrixHeigh / 5 * 2 + 2,
    				matrixWidth / 5 - 4, matrixHeigh / 5 - 4, 20, 20);
    		g2.setColor(new Color(128, 128, 128));
    		g2.draw(round2);// 绘制圆弧矩形
    
    		g2.dispose();
    		matrixImage.flush();
    		return matrixImage;
    	}
    }
    
    

    异常类:

    
    
    /**
     * 
    
     */
    public class QRParamsException extends Exception {
    	private static final long serialVersionUID = 8837582301762730656L;
    
    	public QRParamsException() {
    	} // 用来创建无参数对象
    
    	public QRParamsException(String message) { // 用来创建指定参数对象
    		super(message); // 调用超类构造器
    	}
    }
    
    

    工具处理类:

    
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.Hashtable;
    
    import javax.imageio.ImageIO;
    
    import org.apache.commons.lang3.StringUtils;
    
    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;
    
    /**
     * 
    
     */
    public class QRCodeUtil {
    	private static int width = 500; // 二维码宽度
    	private static int height = 500; // 二维码高度
    	private static int onColor = 0xFF000000; // 前景色
    	private static int offColor = 0xFFFFFFFF; // 背景色
    	private static int margin = 1; // 白边大小,取值范围0~4
    	private static ErrorCorrectionLevel level = ErrorCorrectionLevel.L; // 二维码容错率
    
    	/**
    	 * 生成二维码
    	 * 
    	 * @param params
    	 *            QRCodeParams属性:txt、fileName、filePath不得为空;
    	 * @throws QRParamsException
    	 */
    	public static ByteArrayOutputStream generateQRImage(QRCodeParams params)
    			throws QRParamsException {
    		if (params == null || params.getTxt() == null) {
    			throw new QRParamsException("参数错误");
    		}
    		try {
    			initData(params);
    			String txt = params.getTxt();
    			if (StringUtils.isNoneBlank(params.getLogoPath())) {
    				return generateQRImage(txt, params.getLogoPath());
    			} else {
    				return generateQRImage(txt);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 生成二维码
    	 * 
    	 * @param txt
    	 *            //二维码内容
    	 */
    	public static ByteArrayOutputStream generateQRImage(String txt) {
    		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    		// 指定纠错等级
    		hints.put(EncodeHintType.ERROR_CORRECTION, level);
    		// 指定编码格式
    		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    		hints.put(EncodeHintType.MARGIN, margin);
    		try {
    			BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,
    					BarcodeFormat.QR_CODE, width, height, hints);
    			BufferedImage image = toBufferedImage(bitMatrix);
    			ByteArrayOutputStream out = new ByteArrayOutputStream();
    			try {
    				ImageIO.write(image, "PNG", out);
    				return out;
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * 生成带logo的二维码图片
    	 * 
    	 * @param txt
    	 *            //二维码内容
    	 * @param logoPath
    	 *            //logo绝对物理路径
    	 * @throws Exception
    	 */
    	public static ByteArrayOutputStream generateQRImage(String txt,
    			String logoPath) throws Exception {
    		Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
    		// 指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%)
    		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    		hints.put(EncodeHintType.ERROR_CORRECTION, level);
    		hints.put(EncodeHintType.MARGIN, margin);
    		BitMatrix bitMatrix = new MultiFormatWriter().encode(txt,
    				BarcodeFormat.QR_CODE, width, height, hints);
    		return writeToFile(bitMatrix, logoPath);
    	}
    
    	/**
    	 * 
    	 * @param matrix
    	 *            二维码矩阵相关
    	 * @param format
    	 *            二维码图片格式
    	 * @param file
    	 *            二维码图片文件
    	 * @param logoPath
    	 *            logo路径
    	 * @throws IOException
    	 */
    	public static void writeToFile(BitMatrix matrix, String format, File file,
    			String logoPath) throws IOException {
    		BufferedImage image = toBufferedImage(matrix);
    		Graphics2D gs = image.createGraphics();
    
    		int ratioWidth = image.getWidth() * 2 / 10;
    		int ratioHeight = image.getHeight() * 2 / 10;
    		// 载入logo
    		Image img = ImageIO.read(new File(logoPath));
    		int logoWidth = img.getWidth(null) > ratioWidth ? ratioWidth : img
    				.getWidth(null);
    		int logoHeight = img.getHeight(null) > ratioHeight ? ratioHeight : img
    				.getHeight(null);
    
    		int x = (image.getWidth() - logoWidth) / 2;
    		int y = (image.getHeight() - logoHeight) / 2;
    
    		gs.drawImage(img, x, y, logoWidth, logoHeight, null);
    		gs.setColor(Color.black);
    		gs.setBackground(Color.WHITE);
    		gs.dispose();
    		img.flush();
    		if (!ImageIO.write(image, format, file)) {
    			throw new IOException("Could not write an image of format "
    					+ format + " to " + file);
    		}
    	}
    
    	public static ByteArrayOutputStream writeToFile(BitMatrix matrix,
    			String logoPath) throws IOException {
    		BufferedImage image = toBufferedImage(matrix);
    		// 设置logo图标
    		QRLogoConfig logoConfig = new QRLogoConfig();
    		image = logoConfig.LogoMatrix(image, logoPath);
    
    		ByteArrayOutputStream out = new ByteArrayOutputStream();
    		try {
    			ImageIO.write(image, "PNG", out);
    			return out;
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	public static BufferedImage toBufferedImage(BitMatrix matrix) {
    		int width = matrix.getWidth();
    		int height = matrix.getHeight();
    		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, matrix.get(x, y) ? onColor : offColor);
    			}
    		}
    		return image;
    	}
    
    	public static BitMatrix deleteWhite(BitMatrix matrix) {
    		int[] rec = matrix.getEnclosingRectangle();
    		int resWidth = rec[2] + 1;
    		int resHeight = rec[3] + 1;
    
    		BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
    		resMatrix.clear();
    		for (int i = 0; i < resWidth; i++) {
    			for (int j = 0; j < resHeight; j++) {
    				if (matrix.get(i + rec[0], j + rec[1]))
    					resMatrix.set(i, j);
    			}
    		}
    		return resMatrix;
    	}
    
    	private static void initData(QRCodeParams params) {
    		if (params.getWidth() != null) {
    			width = params.getWidth();
    		}
    		if (params.getHeight() != null) {
    			height = params.getHeight();
    		}
    		if (params.getOnColor() != null) {
    			onColor = params.getOnColor();
    		}
    		if (params.getOffColor() != null) {
    			offColor = params.getOffColor();
    		}
    		if (params.getLevel() != null) {
    			level = params.getLevel();
    		}
    	}
    }
    
    

    调用:

    QRCodeParams qrParams = new QRCodeParams();
    //            url = "http://192.168.1.2:8086/business";
                qrParams.setTxt(url);
                qrParams.setWidth(300);
                qrParams.setHeight(300);
                ByteArrayOutputStream out = QRCodeUtil.generateQRImage(qrParams);
                qrCode = this.uploadService.upload(out,IdUtils.id()+".png");
    
  • 相关阅读:
    REQUIRED与REQUIRED_NEW
    springboot启动原理
    Mysql缓存的配置和使用
    Mysql-15-mysql分布式应用
    Mysql的日志管理
    Mysql的主从复制
    Mysql的备份和恢复
    Mysql-7-mysql函数
    Mysql-6-数据类型和运算符
    Mysql-5-数据表的基本操作
  • 原文地址:https://www.cnblogs.com/jianquan100/p/13726532.html
Copyright © 2020-2023  润新知