ZXing是一种开源的多格式1D/2D条形码图像处理库,在Java中的实现。重点是在手机上使用内置摄像头来扫描和解码设备上的条码,而不与服务器通信。然而,该项目也可以用于对桌面和服务器上的条形码进行编码和解码。目前支持这些格式:

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 93
  • Code 128
  • ITF
  • Codabar
  • RSS-14 (all variants)
  • RSS Expanded (most variants)
  • QR Code
  • Data Matrix
  • Aztec ('beta' quality)
  • PDF 417 ('alpha' qua

在这里仅使用它来生成/解析二维码:(解析二维码后续添加)

创建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生成/解析二维码图片的更多相关文章

  1. 使用zxing生成解析二维码

    1. 前言 随着移动互联网的发展,我们经常在火车票.汽车票.快餐店.电影院.团购网站以及移动支付等各个场景下见到二维码的应用,可见二维码以经渗透到人们生活的各个方面.条码.二维码以及RFID被人们应用 ...

  2. 安卓开发中使用ZXing生成解析二维码

    编码示例 package com.wolf_pan.qrcodesample; import android.graphics.Bitmap; import android.graphics.Colo ...

  3. ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...

  4. JAVA中生成、解析二维码图片的方法

    JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...

  5. qrcode.js的识别解析二维码图片和生成二维码图片

    qrcode只通过前端就能生成二维码和解析二维码图片, 首先要引入文件qrcode.js,下载地址为:http://static.runoob.com/download/qrcodejs-04f46c ...

  6. 用CIFilter生成QRCode二维码图片

    用CIFilter生成QRCode二维码图片 CIFilter不仅仅可以用来做滤镜,它还可以用来生成二维码. CIFilterEffect.h + CIFilterEffect.m // // CIF ...

  7. java生成/解析二维码

    package a; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import ...

  8. JAVA生成解析二维码

    package com.mohe.twocode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.B ...

  9. APS.NET MVC4生成解析二维码简单Demo

    一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewpor ...

随机推荐

  1. gRPC入门

    一.gRPC简介 在介绍gRPC之前先说一下RPC(Remote Procedure Call),也叫远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.相比 ...

  2. _bzoj1026 [SCOI2009]windy数【数位dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位dp果断记忆化搜索,代码量少~ 程序里我用11代表前导零. #include &l ...

  3. 数学 Codeforces Round #308 (Div. 2) B. Vanya and Books

    题目传送门 /* 水题:求总数字个数,开long long竟然莫名其妙WA了几次,也没改啥又对了:) */ #include <cstdio> #include <iostream& ...

  4. foreach的学习使用归纳

    1: 实现对双向链表的遍历使用 LinkedList<string> llary = new LinkedList<string>(); llary.AddLast (&quo ...

  5. 452 Minimum Number of Arrows to Burst Balloons 用最少数量的箭引爆气球

    在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了.开始坐标总是小于结束坐标.平面 ...

  6. 413 Arithmetic Slices 等差数列划分

    如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列.例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列. ...

  7. [转]符号和运算符参考 (F#)

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd233228.aspx 本主题包含一个表,其中列出了 F# 语言中使用的符号和运算符. 符号和运算符表   ...

  8. 1775. [国家集训队2010]小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到 ...

  9. 跨库导表数据(sql)

    程序员用 列子: insert into "000".tbFreeReportselect ReportCode ,ReportName ,GroupNamefrom openda ...

  10. xmind8 Mac破解版(思维导图) 附序列号

    链接: https://pan.baidu.com/s/1PNdLRGpz_jhfPmWAIbLRfw 提取码: ruvm 复制这段内容后打开百度网盘手机App,操作更方便哦 小伙伴们XMind 8 ...