java实现二维码的生成和解析:QRCode、zxing 两种方式
第一种:QRCode.jar,使用QRCode生成和解析二维码
1.导入jar包

2.代码
(1)QRCodeUtil .java
import com.swetake.util.Qrcode;
import jp.sourceforge.qrcode.QRCodeDecoder; import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File; public class QRCodeUtil {
/**
*加密: 文字信息 ->二维码.png
* @param content 文字信息
* @param imgPath 二维码路径
* @param imgType 二维码类型:png
* @param size 二维码尺寸
* @throws Exception
*/
public void encoderQRCode(String content,String imgPath,String imgType,int size) throws Exception{
//BufferedImage :内存中的一张图片
BufferedImage bufImg = qRcodeCommon(content,imgType,size); File file = new File(imgPath);// "src/二维码.png" --> 二维码.png //生成图片
ImageIO.write(bufImg, imgType, file);
} /**
*产生一个二维码的BufferedImage
* @param content 二维码隐藏信息
* @param imgType 图片格式
* @param size 图片大小
* @return
*/
private BufferedImage qRcodeCommon(String content, String imgType, int size) throws Exception {
BufferedImage bufImg =null;
//Qrcode对象:字符串->boolean[][]
Qrcode qrCodeHandler = new Qrcode();
//设置二维码的排错率:7% L<M<Q<H30% :排错率越高,可存储的信息越少;但是对二维码清晰对要求越小
qrCodeHandler.setQrcodeErrorCorrect('M');
//可存放的信息类型:N:数字、 A:数字+A-Z B:所有
qrCodeHandler.setQrcodeEncodeMode('B');
//尺寸:取值范围:1-40
qrCodeHandler.setQrcodeVersion(size); //"Hello world" -> byte[]"Hello world" -->boolean[][]
byte[] contentBytes = content.getBytes("UTF-8");
boolean[][] codeOut = qrCodeHandler.calQrcode(contentBytes); int imgSize = 67 + 12*(size -1) ; //BufferedImage:内存中的图片
bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB );//red green blue //创建一个画板
Graphics2D gs = bufImg.createGraphics();
gs.setBackground(Color.WHITE);//将画板的背景色设置为白色
gs.clearRect( 0,0, imgSize,imgSize); //初始化
gs.setColor(Color.BLACK);//设置 画板上 图像的颜色(二维码的颜色) int pixoff = 2 ; for(int j=0;j<codeOut.length;j++) {
for(int i=0;i<codeOut.length;i++) {
if(codeOut[j][i]) {
gs.fillRect(j*3+pixoff , i*3+pixoff, 3, 3);
}
}
}
//增加LOGO
//将硬盘中的src/logo.png 加载为一个Image对象
Image logo = ImageIO.read(new File("/src/logo.png") ) ;
int maxHeight = bufImg.getHeight();
int maxWdith = bufImg.getWidth(); //在已生成的二维码上 画logo
gs.drawImage(logo,imgSize/5*2,imgSize/5*2, maxWdith/5,maxHeight/5 ,null) ; gs.dispose(); //释放空间
bufImg.flush(); //清理
return bufImg ;
} //解密: 二维码(图片路径) -> 文字信息
public String decoderQRCode(String imgPath) throws Exception{ //BufferedImage内存中的图片 :硬盘中的imgPath图片 ->内存BufferedImage
BufferedImage bufImg = ImageIO.read( new File(imgPath) ) ;
//解密
QRCodeDecoder decoder = new QRCodeDecoder() ; TwoDimensionCodeImage tdcImage = new TwoDimensionCodeImage(bufImg);
byte[] bs = decoder.decode(tdcImage) ; //bufImg
//byte[] -->String
String content = new String(bs,"UTF-8");
return content;
} }
(2)TwoDimensionCodeImage .java
import jp.sourceforge.qrcode.data.QRCodeImage;
import java.awt.image.BufferedImage;
public class TwoDimensionCodeImage implements QRCodeImage {
BufferedImage bufImg; //将图片加载到内存中
public TwoDimensionCodeImage(BufferedImage bufImg) {
this.bufImg = bufImg;
}
public int getWidth() {
return bufImg.getWidth();
}
public int getHeight() {
return bufImg.getHeight();
}
public int getPixel(int x, int y) {
return bufImg.getRGB(x,y);
}
}
(3)Test .java
public class Test {
public static void main(String[] args) throws Exception{
//生成二维码
/*
* 生成图片的路径 src/二维码.png
* 文字信息、网址信息 : "helloworld"
*/
String imgPath = "e:\\二维码2.png";
String content = "http://baidu.com"; //扫描二维码后,网页跳转
//生成二维码
/*
* 加密: 文字信息 ->二维码
* 解密: 二维码 -> 文字信息
*/
QRCodeUtil qrUtil = new QRCodeUtil();
//加密: 文字信息 ->二维码
qrUtil.encoderQRCode(content, imgPath, "png", 17);
// TwoDimensionCode handler = new TwoDimensionCode();
// handler.encoderQRCode(content, imgPath, "png", 7);
// //解密: 二维码 -> 文字信息
String imgContent = qrUtil.decoderQRCode(imgPath) ;
System.out.println(imgContent);
}
}
第二种:借助Google提供的ZXing Core工具包
1.maven依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.1</version>
</dependency>
2.代码
(1)ZXingUtil .java
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import jp.sourceforge.qrcode.util.Color; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map; public class ZXingUtil {
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)? Color.BLACK:Color.WHITE) );
}
}
//画logo
image = LogoUtil.logoMatrix(image, logo) ;
//string->file
File file = new File(imgPath);
//生成图片
ImageIO.write(image, format, file);
} //解密:二维码->文字
public static void decodeImg(File file) throws Exception {
if(!file.exists()) return ;
//file->内存中的一张图片
BufferedImage imge = ImageIO.read(file) ; MultiFormatReader formatReader = new MultiFormatReader() ;
LuminanceSource source = new BufferedImageLuminanceSource(imge);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
//图片 ->result
Map map = new HashMap();
map.put(EncodeHintType.CHARACTER_SET, "utf-8") ;
Result result = formatReader.decode(binaryBitmap ,map ) ;
System.out.println("解析结果:"+ result.toString());
} }
(2)LogoUtil .java
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; public class LogoUtil {
//传入logo、二维码 ->带logo的二维码
public static BufferedImage logoMatrix( BufferedImage matrixImage,String logo ) throws IOException {
//在二维码上画logo:产生一个 二维码画板
Graphics2D g2 = matrixImage.createGraphics(); //画logo: String->BufferedImage(内存)
BufferedImage logoImg = ImageIO.read(new File(logo));
int height = matrixImage.getHeight();
int width = matrixImage.getWidth();
//纯logo图片
g2.drawImage(logoImg, width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, null); //产生一个 画 白色圆角正方形的 画笔
BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
//将画板-画笔 关联
g2.setStroke(stroke);
//创建一个正方形
RoundRectangle2D.Float round = new RoundRectangle2D.Float(width * 2 / 5, height * 2 / 5, width * 1 / 5, height * 1 / 5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
g2.setColor(Color.WHITE);
g2.draw(round); //灰色边框
BasicStroke stroke2 = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
g2.setStroke(stroke2);
//创建一个正方形
RoundRectangle2D.Float round2 = new RoundRectangle2D.Float(width * 2 / 5 + 2, height * 2 / 5 + 2, width * 1 / 5 - 4, height * 1 / 5 - 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
// Color color = new Color(128,128,128) ;
g2.setColor(Color.GRAY);
g2.draw(round2); g2.dispose();
matrixImage.flush(); return matrixImage;
}
}
(3)test.java
import java.io.File;
public class test {
public static void main(String[] args) throws Exception {
String imgPath = "src/二维码12.png";
String content = "helloworld你好";
String logo = "src/logo.png";
//加密:文字信息->二维码
ZXingUtil.encodeImg(imgPath, "png",content, 430, 430,logo);
//解密:二维码 ->文字信息
ZXingUtil.decodeImg(new File(imgPath));
}
}
(效果图)

java实现二维码的生成和解析:QRCode、zxing 两种方式的更多相关文章
- 关于java的二维码的生成与解析
本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio ...
- Java 条形码 二维码 的生成与解析
Barcode简介 Barcode是由一组按一定编码规则排列的条,空符号,用以表示一定的字符,数字及符号组成的,一种机器可读的数据表示方式. Barcode的形式多种多样,按照它们的外观分类: Lin ...
- java实现二维码的生成与解析
简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反,就是将一张经过编码的图片解析为数字或者文字. 当然 ...
- 【Java】Java实现二维码的生成与解析
pom依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</ ...
- ZXing二维码的生成和解析
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法, 现在我简单介绍一下使用Java利用Zxing生成与解析二维码 注意: 二维码的生成需要借助辅助类( ...
- .net core 的图片处理及二维码的生成及解析
写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...
- 关于用Java实现二维码的生成
昨天晚上看了一个视频讲的是web端把名片搞成二维码的形式,觉得挺有意思的,不过我还是初学,所以就没在网页端实现,写了命令行程序. 虽然看着程序很短,不过写的过程中还是出了问题, 最致命的就是 Grap ...
- java实现二维码的生成.
目录 1.二维码概念 2.二维码发展历史 3.二维码分类 4.二维码优缺点 5.QR Code 1.二维码又称 二维条码 (2-dimensional bar code)是用某种特定的几何 ...
- java二维码的生成与解析代码
二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1. 高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或 ...
随机推荐
- 注释web.xml
注释掉红框里的内容
- 爬虫实战 豆瓣音乐top250 xpath
刷知乎时刷到一篇爬取豆瓣音乐top250的,然后看了看,感觉自己的爬虫又更上一层楼了哈啊哈哈,尤其是发现xpath这么好用的东西. 不过也有一个感慨,就是有很多种方式都可以获得想要的数据,对于入门的新 ...
- laravel中如何区分get数据和post数据
可能有时候会碰到这样的场景: 有一个post提交请求,请求地址为:xxx?id=10,提交的post数据为:id=20而在控制器中,我要同时得到get和post中数据get中的id为10,而post中 ...
- 基于pyqt5的图片素材批量处理工具
功能 分辨率的批量转换,文件夹递归查找 像素偏移量批量调整,文件夹单层查找 画布的大小的批量进行调整,不进行缩放,文件夹单层查找 界面 通过PyUIC生成的代码 # -*- coding: utf-8 ...
- ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合
建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...
- Android开发模拟器(虚拟机)的连接等操作
前10天一直在解决android开发环境的问题,我将Androidstudio下载并安装好之后,进入IDE之后,下载AVDmanger中的虚拟机以及SDK等等.之后发现并不能运行虚拟机,根本无法打开虚 ...
- numpy特性
numpy特性 待办 可获取最小值最大值或者排序等操作的索引,然后通过索引取得对应值或者对应值的序列 按行按列求和.按行按列求积 方差等等统计函数使用 enter description here e ...
- Java常量,变量,对象(字面量)在JVM内存中的存储位置
Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540 收藏 更多 分类专栏: JAVA jvm 苦苦研究了快 ...
- python基于百度AI开发文字识别
很多场景都会用到文字识别,比如app或者网站里都会上传身份证等证件以及财务系统识别报销证件等等 第一步,你需要去百度AI里去注册一个账号,然后新建一个文字识别的应用 然后你将得到一个API Key 和 ...
- Java 数据库树形查询生成菜单结构
Java 数据库树形查询 JAVA从数据库读取菜单,递归生成菜单树. 定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 priv ...