使用java生成、解析二维码

一、导入jar包(在工程中可以导入依赖)

在一个普通的java项目中,我们需要导入相关的jar包来生成和解析二维码,但是在一个maven工程等等的web项目中,我们可以通过带入相关依赖来实现。
jar包链接: https://pan.baidu.com/s/1Vk6QnyFWQuMxm85RsMOrAg
提取码:9nbk
如果添加依赖的话,可以导入下面的Zxing依赖:

	<dependency>
     	<groupId>com.google.zxing</groupId>
     	<artifactId>core</artifactId>
     	<version>3.3.0</version>
 	</dependency>
 	<dependency>
     	<groupId>com.google.zxing</groupId>
     	<artifactId>javase</artifactId>
     	<version>3.3.0</version>
 	</dependency>

下面我以导包为例分别来演示生成、解析二维码。

二、生成二维码

代码:

package com.qrcode;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
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.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

public class CreatQRCode {
	public static void main(String[] args) throws IOException {
		
		//定义二维码的相关参数
		int size = 300;//尺寸
		String content = "第一个二维码";//二维码的内容
		
		//二维码要生成的数据参数
		Hashtable<EncodeHintType, Object> hits = new Hashtable<EncodeHintType, Object>();
		//容错级别是最高级别
		hits.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H);
		//内容的字符集
		hits.put(EncodeHintType.CHARACTER_SET,"UTF-8");
		//二维码的内容
		hits.put(EncodeHintType.MARGIN, 1);
		
		try {
			//格式输出流
			MultiFormatWriter out = new MultiFormatWriter();
			//创建二维码矩阵
			BitMatrix bitMatrix = out.encode(content, BarcodeFormat.QR_CODE, size, size,hits);
		
			//创建一个图像缓冲区,用来存放二维码的图像数据
			BufferedImage bufferQR = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
			
			//将bitMatrix的数据写到缓冲区图像中
			for(int i = 0; i < size ; i ++) {
				for(int j = 0; j < size ; j++) {
					
					//从bitMatrix取出每一个像素点的颜色  true为1  false为0
					int rgb = bitMatrix.get(i, j)?0xFF000000:0xFFFFFFFF;
					
					//设置bufferQR对应的位置颜色和bitMatrix一致
					bufferQR.setRGB(i, j, rgb);
				}
			}
			
			
			//添加logo,就是二维码中间的那个图片
			File logo = new File("本地图片的地址");
			Image image = ImageIO.read(logo);
			Image src = image.getScaledInstance(60, 60, Image.SCALE_SMOOTH);
			//在缓冲区图像上绘制logo
			Graphics2D g = bufferQR.createGraphics();
			int x = (size-src.getWidth(null))/2;
			int y = (size-src.getHeight(null))/2;
			g.drawImage(src, x, y,null);
			
			//圆角矩形
			Shape shape = new RoundRectangle2D.Float(x,y,60,60,6,6);
			g.setStroke(new BasicStroke(1f));
			g.setColor(Color.gray);
			g.draw(shape);
			g.dispose();
			
			//生成图像位置,我这是生成到本地E盘,文件名为QR.png
			File file = new File("E:\\QR.png");
			
			//将内存中的图像写到文件
			ImageIO.write(bufferQR,"png",file);//对应上面的文件类型
		} catch (WriterException e) {
			e.printStackTrace();
		}
	}
}

生成的二维码:
在这里插入图片描述
因为是采用的google的相关jar包,所以用微信扫的时候需要跳转查看。

三、解析二维码

代码演示:

package com.qrcode;

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.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class ReadQRCode {

	public static void main(String[] args) throws Exception {
		
		try {
			//得到图片并存入文件
			File file = new File("E:\\QR.png");
			//将图片文件转换成内存缓冲区图像
			BufferedImage buffer = ImageIO.read(file);

			//创建数据源对象
			BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(buffer); 
		
			//创建一个二值化器对象
			HybridBinarizer binarizer = new HybridBinarizer(source);
			
			//使用二值化器得到二进制图像
			BinaryBitmap bitmap = new BinaryBitmap(binarizer);
			
			//定义解析标准参数
			Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
			hints.put(DecodeHintType.CHARACTER_SET,"UTF-8");
			
			//开始解析二进制图像
			MultiFormatReader reader = new MultiFormatReader();
			
			//开始解析,获得解析的结果
			Result rs = reader.decode(bitmap,hints);
			
			//提取数据
			String msg = rs.getText();
			System.out.println(msg);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值