• Java实现带logo的二维码


    Java实现带logo的二维码

    二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能。好了,我们来一起实现一下吧。

    我们实现的二维码是基于QR Code的标准的,QR Code是由日本Denso公司于1994年研制的一种矩阵二维码符号码,全称是Quick Response Code

    QR Code:专利公开,支持中文;

    QR Code与其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势;

    纠错能力:

    L级:约可纠错7%的数据码字
    M级:约可纠错15%的数据码字
    Q级:约可纠错25%的数据码字
    H级:约可纠错30%的数据码字

    知道了这些硬知识后,我们做一下准备工作,我们需要下载两个jar包,辅助我们开发,这里我放上链接
    http://mavenrepository.com/artifact/com.google.zxing/javase
    http://mavenrepository.com/artifact/com.google.zxing/core/3.3.2

    我们在我们的工程下,新建一个java project 项目就可以了,可以新建三个lib、utils、test三个文件夹;lib存放jar包,utils放我们写的工具类,test用来放我们写的测试类

    我们先从不带logo的二维码开始
    思路:

    1、设置一些二维码的参数;如 字符集、外边距、容错等级

    2、生成二维码

    好了,我们来实现一下

    /**
    	 * 
    	 * @param width 二维码的宽
    	 *            
    	 * @param height 二维码的高
    	 *            
    	 * @param content 二维码的内容
    	 *            
    	 */
    	public static void createQrCode(int width, int height, String content) {
    
    		// 1、设置二维码的一些参数
    		HashMap hints = new HashMap();
    
    		// 1.1设置字符集
    		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    
    		// 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
    		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
    
    		// 1.3设置外边距;(即白色区域)
    		hints.put(EncodeHintType.MARGIN, 1);
    
    		// 2、生成二维码
    
    		try {
    			// 2.1定义BitMatrix对象
    			BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    
    			// 2.2、设置二维码存放路径,以及二维码的名字
    			Path codePath = new File("c:/Users/admin/Desktop/code/" + UUID.randomUUID() + ".png").toPath();
    
    			// 2.3、执行生成二维码
    			MatrixToImageWriter.writeToPath(bitMatrix, "png", codePath);
    
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    
    我们来实现一下带logo的二维码
    思路:

    1、 我们先生成一个LogoConfig的配置类,主要是设置logo边框颜色;logo边框宽度;logo大小

    2、 设置一些二维码的参数

    3、 生成二维码

    4、 生成带logo的二维码

    我们来实现一下

    LogoConfig类
    class LogoConfig {
    	// logo默认边框颜色
    	public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
    	// logo默认边框宽度
    	public static final int DEFAULT_BORDER = 2;
    	// logo大小默认为照片的1/6
    	public static final int DEFAULT_LOGOPART = 6;
    
    	private final int border = DEFAULT_BORDER;
    	private final Color borderColor;
    	private final int logoPart;
    
    	public LogoConfig() {
    		this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
    	}
    
    	public LogoConfig(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;
    	}
    }
    
    生成中间有logo的二维码的工具函数
    /**
    	 * 生成中间有logo的二维码
    	 * 
    	 * @param width
    	 * @param height
    	 * @param content
    	 */
    	public static void createLogoQrCode(int width, int height, String content) {
    
    		// 1、设置二维码的一些参数
    		HashMap hints = new HashMap();
    
    		// 1.1设置字符集
    		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    
    		// 1.2设置容错等级;因为有了容错,在一定范围内可以把二维码p成你喜欢的样式
    		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    
    		// 1.3设置外边距;(即白色区域)
    		hints.put(EncodeHintType.MARGIN, 1);
    
    		// 2、生成二维码
    
    		try {
    			// 2.1定义BitMatrix对象
    			BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    
    			// 2.2、设置二维码存放路径,以及二维码的名字
    
    			// qrFile用来存放生成的二维码图片
    			File qrFile = new File("c:/Users/admin/Desktop/code", UUID.randomUUID() + ".jpg");
    
    			// logoFile用来存放带有logo的二维码图片
    			File logoFile = new File("c:/Users/admin/Desktop/code", "test.jpg");
    
    			// 2.3、执行生成二维码
    			MatrixToImageWriter.writeToPath(bitMatrix, "jpg", qrFile.toPath());
    
    			// 2.4在二维码中添加logo
    			LogoConfig logoConfig = new LogoConfig();
    			addLogo(qrFile, logoFile, logoConfig);
    		
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    
    添加logo的工具类
    /**
    	 * 
    	 * @param qrPic 二维码文件路径
    	 * @param logoPic logo文件路径
    	 * @param logoConfig 配置类
    	 */
    	private static void addLogo(File qrPic, File logoPic, LogoConfig logoConfig) {
    
    		if (!qrPic.isFile() || !logoPic.isFile()) {
    			System.out.println("file not found!");
    			System.exit(0);
    		}
    
    		try {
    
    			// 1、读取二维码图片,并构建绘图对象
    			BufferedImage image = ImageIO.read(qrPic);
    			Graphics2D graph = image.createGraphics();
    
    			// 2、读取logo图片
    			BufferedImage logo = ImageIO.read(logoPic);
    
    			int widthLogo = image.getWidth() / logoConfig.getLogoPart();
    			int heightLogo = image.getHeight() / logoConfig.getLogoPart();
    
    			// 3、计算图片放置的位置
    			int x = (image.getWidth() - widthLogo) / 2;
    			int y = (image.getHeight() - heightLogo) / 2;
    
    			// 4、绘制图片
    			graph.drawImage(logo, x, y, widthLogo, heightLogo, null);
    			graph.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
    			graph.setStroke(new BasicStroke(logoConfig.getBorder()));
    			graph.setColor(logoConfig.getBorderColor());
    			graph.drawRect(x, y, widthLogo, heightLogo);
    
    			graph.dispose();
    			
    			ImageIO.write(image, "jpeg", new File("C:/Users/admin/Desktop/code/newPic.jpg"));
    
    		} catch (Exception e) {
    			System.out.println(e);
    
    		}
    	}
    

    我们写一个测试类来测试一下

    @Test
    public void test() {
    		QrCodeUtils.createQrCode(100, 100, "你好,世界");
    		
    		QrCodeUtils.readQrCode("C:\Users\admin\Desktop\code\4ad3a0a4-8d5c-4cd3-9ee5-5f680233a33f.png");
    		
    		QrCodeUtils.createLogoQrCode(300, 300, "https://www.jianshu.com/u/f84a2d49420b");
    		QrCodeUtils.readQrCode("C:\Users\admin\Desktop\code\newPic.jpg");
    	}
    
    

    我就不放生成好的二维码了,大家可以自己试试

    我们补充一个读取二维码内容的工具函数

    /**
    	 * 解析二维码
    	 * 
    	 * @param codePath 二维码存放全路径 
    	 *            
    	 */
    	public static void readQrCode(String codePath) {
    
    		try {
    
    			MultiFormatReader formatReader = new MultiFormatReader();
    
    			File QrCode = new File(codePath);
    
    			BufferedImage image = ImageIO.read(QrCode);
    
    			BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
    
    			// 设置二维码的参数
    			HashMap hints = new HashMap();
    
    			hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
    
    			Result result = formatReader.decode(binaryBitmap, hints);
    
    			// 打印解析结果
    			System.out.println(result.toString());
    
    			// 打印二维码格式
    			System.out.println(result.getBarcodeFormat());
    
    			// 二维码文本内容
    			System.out.println(result.getText());
    
    		} catch (Exception e) {
    			System.out.println(e);
    		}
    
    	}
    
    

    注:二维码是有一定纠错能力的,你可以把二维码p成你喜欢的样式

  • 相关阅读:
    图像的余弦变换
    图像的傅里叶变换
    图像的频域变换
    数字图像处理基本运算
    数字图像处理基本概念
    推荐几款提升效率的神器
    机器学习中常用的距离及其python实现
    打造自己的图像识别模型
    使用Colaboratory的免费GPU训练神经网络
    学霸修炼的秘籍
  • 原文地址:https://www.cnblogs.com/qjmnong/p/9102800.html
Copyright © 2020-2023  润新知