Java使用ZXing生成/解析二维码图片
ZXing是一种开源的多格式1D/2D条形码图像处理库,在Java中的实现。重点是在手机上使用内置摄像头来扫描和解码设备上的条码,而不与服务器通信。然而,该项目也可以用于对桌面和服务器上的条形码进行编码和解码。目前支持这些格式:
|
|
|
|
在这里仅使用它来生成/解析二维码:(解析二维码后续添加)
创建maven项目,在pom.xml文件中添加zxing的jar包依赖:
<!-- zxingQRcode生成支持包 -->
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
以下为整合的二维码生成工具类:
package com.esheng.util; import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map; 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.client.j2se.MatrixToImageConfig;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.CharacterSetECI;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /**
* QRCode生成工具类
* @author: LinWenLi
* @date: 2018-08-23 12:45:34
*/
public class QRCodeUtils { /**
* 二维码BufferedImage对象生成方法
* @author LinWenLi
* @date 2018-08-23 12:51:00
* @param contents二维码内容
* @param width二维码图片宽度
* @param height二维码图片高度
* @param margin二维码边框(0,2,4,8)
* @throws Exception
* @return: BufferedImage
*/
public static BufferedImage createQRCode(String contents, int width, int height,int margin) throws Exception {
if (contents == null || contents.equals("")) {
throw new Exception("contents不能为空。");
}
// 二维码基本参数设置
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, CharacterSetECI.UTF8);// 设置编码字符集utf-8
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);// 设置纠错等级L/M/Q/H,当二维码被损毁一部分时,纠错等级越高,越可能读取成功;同样的,纠错等级越高,单位面积内点阵的点越多,机器扫描时,识别所需时间越长,当前设置等级为最高等级H
hints.put(EncodeHintType.MARGIN, margin);// 可设置范围为0-10,但仅四个变化0 1(2) 3(4 5 6) 7(8 9 10)
// 生成图片类型为QRCode
BarcodeFormat format = BarcodeFormat.QR_CODE;
// 创建位矩阵对象
BitMatrix matrix = null;
try {
// 生成二维码对应的位矩阵对象
matrix = new MultiFormatWriter().encode(contents, format, width, height, hints);
} catch (WriterException e) {
e.printStackTrace();
}
// 设置位矩阵转图片的参数
MatrixToImageConfig config = new MatrixToImageConfig(Color.black.getRGB(), Color.white.getRGB());
// 位矩阵对象转BufferedImage对象
BufferedImage qrcode = MatrixToImageWriter.toBufferedImage(matrix, config);
return qrcode;
} /**
* 二维码添加LOGO
* @author LinWenLi
* @date 2018-08-23 13:17:07
* @param qrcode
* @param width二维码图片宽度
* @param height二维码图片高度
* @param logoPath图标LOGO路径
* @param logoSizeMultiple二维码与LOGO的大小比例
* @throws Exception
* @return: BufferedImage
*/
public static BufferedImage createQRCodeWithLogo(BufferedImage qrcode,int width, int height, String logoPath, int logoSizeMultiple) throws Exception {
File logoFile = new File(logoPath);
if (!logoFile.exists() && !logoFile.isFile()) {
throw new Exception("指定的LOGO图片路径不存在!");
}
try {
// 读取LOGO
BufferedImage logo = ImageIO.read(logoFile);
// 设置LOGO宽高
int logoHeight = qrcode.getHeight()/logoSizeMultiple;
int logowidth = qrcode.getWidth()/logoSizeMultiple;
// 设置放置LOGO的二维码图片起始位置
int x = (qrcode.getWidth() - logowidth)/2;
int y = (qrcode.getHeight() - logoHeight)/2;
// 新建空画板
BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 新建画笔
Graphics2D g = (Graphics2D) combined.getGraphics();
// 将二维码绘制到画板
g.drawImage(qrcode, 0, 0, null);
// 设置不透明度,完全不透明1f,可设置范围0.0f-1.0f
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
// 绘制LOGO
g.drawImage(logo, x, y, logowidth, logoHeight, null);
return combined;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
} /**
* 导出到指定路径
* @author LinWenLi
* @date 2018-08-23 12:59:03
* @param bufferedImage
* @param filePath图片保存路径
* @param fileName图片文件名
* @param formatName图片格式
* @return: boolean
*/
public static boolean generateQRCodeToPath(BufferedImage bufferedImage,String filePath, String fileName, String formatName) {
// 判断路径是否存在,不存在则创建
File path = new File(filePath);
if (!path.exists()) {
path.mkdirs();
}
// 路径后补充斜杠
if (filePath.lastIndexOf("\\") != filePath.length() - 1) {
filePath = filePath + "\\";
}
// 组合为图片生成的全路径
String fileFullPath = filePath + fileName + "." + formatName;
boolean result = false;
try {
// 输出图片文件到指定位置
result = ImageIO.write(bufferedImage, formatName, new File(fileFullPath));
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
然后是测试代码:
public static void main(String[] args) {
String contents = "二维码内容";
int width = 220;// 二维码宽度
int height = 220;// 二维码高度
int margin = 0;// 二维码边距 String logoPath = "C:\\Users\\myComputer\\Desktop\\LOGO.jpg";// LOGO图片路径
int logoSizeMultiple = 3;// 二维码与LOGO的大小比例 String filePath = "C:\\Users\\myComputer\\Desktop\\";// 指定生成图片文件的保存路径
String fileName = "imageName";// 生成的图片文件名
String formatName = "jpg";// 生成的图片格式,可自定义 try {
// 生成二维码
BufferedImage qrcode = QRCodeUtils.createQRCode(contents, width, height,margin);
// 添加LOGO
qrcode = QRCodeUtils.createQRCodeWithLogo(qrcode, width, height, logoPath,logoSizeMultiple);
// 导出到指定路径
boolean result = QRCodeUtils.generateQRCodeToPath(qrcode, filePath, fileName, formatName);
System.out.println("执行结果" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
Java使用ZXing生成/解析二维码图片的更多相关文章
- 使用zxing生成解析二维码
1. 前言 随着移动互联网的发展,我们经常在火车票.汽车票.快餐店.电影院.团购网站以及移动支付等各个场景下见到二维码的应用,可见二维码以经渗透到人们生活的各个方面.条码.二维码以及RFID被人们应用 ...
- 安卓开发中使用ZXing生成解析二维码
编码示例 package com.wolf_pan.qrcodesample; import android.graphics.Bitmap; import android.graphics.Colo ...
- ZXing 生成、解析二维码图片的小示例
概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...
- JAVA中生成、解析二维码图片的方法
JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...
- qrcode.js的识别解析二维码图片和生成二维码图片
qrcode只通过前端就能生成二维码和解析二维码图片, 首先要引入文件qrcode.js,下载地址为:http://static.runoob.com/download/qrcodejs-04f46c ...
- 用CIFilter生成QRCode二维码图片
用CIFilter生成QRCode二维码图片 CIFilter不仅仅可以用来做滤镜,它还可以用来生成二维码. CIFilterEffect.h + CIFilterEffect.m // // CIF ...
- java生成/解析二维码
package a; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import ...
- JAVA生成解析二维码
package com.mohe.twocode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.B ...
- APS.NET MVC4生成解析二维码简单Demo
一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewpor ...
随机推荐
- 【CSS】少年,你想拥有写轮眼么?
最近笔者在公司内部开展了一次CSS讲座,由于授课经验不太足,授课效果自我感觉并不太好,不过课中有一个笔者用CSS写的一个小效果,其中还是包含了蛮多CSS的常见知识点的,正好也有部分同学很感兴趣如何实现 ...
- A Simple Task CodeForces - 11D
A Simple Task CodeForces - 11D 题意:输出一个无向图的简单环数量.简单环指无重复边的环.保证图无重边自环. ans[i][j]表示"包含i中的点,以i中第一个点 ...
- Create the first sql server 2016 mobile report;创建 第一个 sqlserver 2016 Mobile report
在微软收购了datazen之后,sqlserver2016 集成了mobilereport,mobile report 基于html5,兼容各类主流浏览器,之前ssrs2008 R2中很多chart类 ...
- 使用Maven将dubbox安装进资源仓库
dubbox网址:https://github.com/dangdangdotcom/dubbox dobbox版本:https://github.com/dangdangdotcom/dubbox/ ...
- angular2+typescript在asp.net MVC Web项目上的实现
网上现在还没有关于angular2+typescript在asp.net mvc web项目上的实现的系统介绍,这里我也只是探索到了一个简单的方式,还有很多问题没能解决.但是能有个好的开头也值得记录一 ...
- C. Timofey and a tree 观察题 + dfs模拟
http://codeforces.com/contest/764/problem/C 题意:在n个顶点中随便删除一个,然后分成若干个连通子图,要求这若干个连通子图的颜色都只有一种. 记得边是双向的, ...
- mysql之修改字符编码
目录 统一修改字段编码 修改单个字段编码 修改表字符编码 统一修改字段编码: alter table `tablename` convert to character set utf8; 修改表字符编 ...
- Map接口框架图
Java集合大致可分为Set.List和Map三种体系,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map则代表具有映射关系的集合.Java 5之后,增加了Queue体系集合, ...
- SOA测试之浏览器插件
1. Chrome HTTP Rest Client 插件: 1.1 Postman: https://chrome.google.com/webstore/detail/postman-rest-c ...
- uoj #15. 【NOIP2014】生活大爆炸版石头剪刀布
石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的石头剪 ...