一,zxing是什么?

1,zxing的用途

如果我们做二维码的生成和扫描,通常会用到zxing这个库,

ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库。

zxing还可以实现使用手机的内置的摄像头完成条形码的扫描及解码

2,zxing官方项目地址:

https://github.com/zxing/zxing

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,项目地址

https://github.com/liuhongdi/qrcode

2, 项目功能说明:

生成二维码直接展示

生成二维码保存成图片

解析二维码图片中的文字信息

3,项目结构,如图:

三,配置文件说明

1,pom.xml

        <!--qrcode begin-->
<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.4.0</version>
</dependency>
<!--qrcode end-->

导入zxing库供生成qrcode使用

四,java代码说明

1,QrCodeUtil.java

/**
* 二维码工具类
* by liuhongdi
*/
public class QrCodeUtil { //编码格式,采用utf-8
private static final String UNICODE = "utf-8";
//图片格式
private static final String FORMAT = "JPG";
//二维码宽度像素pixels数量
private static final int QRCODE_WIDTH = 300;
//二维码高度像素pixels数量
private static final int QRCODE_HEIGHT = 300;
//LOGO宽度像素pixels数量
private static final int LOGO_WIDTH = 100;
//LOGO高度像素pixels数量
private static final int LOGO_HEIGHT = 100; //生成二维码图片
//content 二维码内容
//logoPath logo图片地址
private static BufferedImage createImage(String content, String logoPath) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, UNICODE);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_WIDTH, QRCODE_HEIGHT,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
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) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logoPath == null || "".equals(logoPath)) {
return image;
}
// 插入图片
QrCodeUtil.insertImage(image, logoPath);
return image;
} //在图片上插入LOGO
//source 二维码图片内容
//logoPath LOGO图片地址
private static void insertImage(BufferedImage source, String logoPath) throws Exception {
File file = new File(logoPath);
if (!file.exists()) {
throw new Exception("logo file not found.");
}
Image src = ImageIO.read(new File(logoPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (width > LOGO_WIDTH) {
width = LOGO_WIDTH;
}
if (height > LOGO_HEIGHT) {
height = LOGO_HEIGHT;
}
Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
// 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_WIDTH - width) / 2;
int y = (QRCODE_HEIGHT - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
} //生成带logo的二维码图片,保存到指定的路径
// content 二维码内容
// logoPath logo图片地址
// destPath 生成图片的存储路径
public static String save(String content, String logoPath, String destPath) throws Exception {
BufferedImage image = QrCodeUtil.createImage(content, logoPath);
File file = new File(destPath);
String path = file.getAbsolutePath();
File filePath = new File(path);
if (!filePath.exists() && !filePath.isDirectory()) {
filePath.mkdirs();
}
String fileName = file.getName();
fileName = fileName.substring(0, fileName.indexOf(".")>0?fileName.indexOf("."):fileName.length())
+ "." + FORMAT.toLowerCase();
System.out.println("destPath:"+destPath);
ImageIO.write(image, FORMAT, new File(destPath));
return fileName;
} //生成二维码图片,直接输出到OutputStream
public static void encode(String content, String logoPath, OutputStream output)
throws Exception {
BufferedImage image = QrCodeUtil.createImage(content, logoPath);
ImageIO.write(image, FORMAT, output);
} //解析二维码图片,得到包含的内容
public static String decode(String path) throws Exception {
File file = new File(path);
BufferedImage image = ImageIO.read(file);
if (image == null) {
return null;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, UNICODE);
result = new MultiFormatReader().decode(bitmap, hints);
return result.getText();
}
}

工具类,包含了生成二维码、保存二维码,展示二维码,解析二维码

2,HomeController.java

@RequestMapping("/home")
@Controller
public class HomeController {
//生成带logo的二维码到response
@RequestMapping("/qrcode")
public void qrcode(HttpServletRequest request, HttpServletResponse response) {
String requestUrl = "http://www.baidu.com";
try {
OutputStream os = response.getOutputStream();
QrCodeUtil.encode(requestUrl, "/data/springboot2/logo.jpg", os);
} catch (Exception e) {
e.printStackTrace();
}
} //生成不带logo的二维码到response
@RequestMapping("/qrnologo")
public void qrnologo(HttpServletRequest request, HttpServletResponse response) {
String requestUrl = "http://www.baidu.com";
try {
OutputStream os = response.getOutputStream();
QrCodeUtil.encode(requestUrl, null, os);
} catch (Exception e) {
e.printStackTrace();
}
} //把二维码保存成文件
@RequestMapping("/qrsave")
@ResponseBody
public String qrsave() {
String requestUrl = "http://www.baidu.com";
try {
QrCodeUtil.save(requestUrl, "/data/springboot2/logo.jpg", "/data/springboot2/qrcode2.jpg");
} catch (Exception e) {
e.printStackTrace();
}
return "文件已保存";
} //解析二维码中的文字
@RequestMapping("/qrtext")
@ResponseBody
public String qrtext() {
String url = "";
try {
url = QrCodeUtil.decode("/data/springboot2/qrcode2.jpg");
} catch (Exception e) {
e.printStackTrace();
}
return "解析到的url:"+url;
}
}

入口处包含了四个方法,接下来我们做测试

五,测试效果

1,生成不带logo的二维码,访问:

http://127.0.0.1:8080/home/qrnologo

效果:

2,生成带logo的二维码:访问

http://127.0.0.1:8080/home/qrcode

效果:

3,生成二维码保存成文件:访问:

http://127.0.0.1:8080/home/qrsave

代码中文件被保存成了:/data/springboot2/qrcode2.jpg

4,解析二维码中包含的文字信息:访问:

http://127.0.0.1:8080/home/qrtext

返回:

解析到的url:http://www.baidu.com

成功解析到了图片中包含的url地址

六,查看spring boot版本

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.2.RELEASE)

spring boot:用zxing生成二维码,支持logo(spring boot 2.3.2)的更多相关文章

  1. 使用jquery.qrcode生成二维码支持logo,和中文

    /* utf.js - UTF-8 <=> UTF-16 convertion * * Copyright (C) 1999 Masanao Izumo <iz@onicos.co. ...

  2. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  3. zxing生成二维码设置边框颜色

    真是研究了很久很久,满满的泪啊 zxing生成二维码,默认是可以增加空白边框的,但是并没有可以设置边框颜色的属性. 其中增加空白边框的属性的一句话是: Map hints = new HashMap( ...

  4. java学习-zxing生成二维码矩阵的简单例子

    这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...

  5. 通过zxing生成二维码

    二维码现在随处可见,在日常的开发中,也会经常涉及到二维码的生成,特别是开发一些活动或者推广方面的功能时,二维码甚至成为必备功能点.本文介绍通过 google 的 zxing 包生成带 logo 的二维 ...

  6. 使用google zxing生成二维码图片

    生成二维码工具类: 1 import java.awt.geom.AffineTransform; 2 import java.awt.image.AffineTransformOp; 3 impor ...

  7. 使用jquery-qrcode在页面上生成二维码,支持中文

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. C#Qrcode生成二维码支持中文,带图片,带文字

    C#Qrcode生成二维码支持中文带图片的操作请看二楼的帖子,当然开始需要下载一下C#Qrcode的源码 下载地址 : http://www.codeproject.com/Articles/2057 ...

  9. C# 生成二维码(带Logo)

    C# 生成二维码(带Logo) 第一种方式 我们需要引用 ThoughtWorks.QRCode.dll  生成带logo二维码(framework4.0以上) 下载地址:https://pan.ba ...

随机推荐

  1. CSS的坑

    如何触发 bfc 规则 浮动元素:float 除 none 以外的值 绝对定位元素:position (absolute.fixed) display 为 inline-block.table-cel ...

  2. ansible使用,常用模块

    使用ansible管理其他主机有两种方式: 1.命令行执行ansible ad-hoc命令 2.把要做的动作行为写入一个文件[playbook脚本],ansible读取脚本自动完成相应的任务. Ans ...

  3. 超详细!盘点Python中字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...

  4. Java I/O流 复制文件速度对比

    Java I/O流 复制文件速度对比 首先来说明如何使用Java的IO流实现文件的复制: 第一步肯定是要获取文件 这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之) FileInp ...

  5. python之类方法和静态方法

    在类中定义的函数称为方法,主要有三种:实例方法.类方法.静态方法. class MyTest(): # 普通实例函数 def func1(self, arg1, arg2): pass # 类函数 @ ...

  6. HA切换失败原因分析

    1. 问题描述 redhat在进行HA切换时,需要先停止service,并释放调当前主机占有的资源,比如说IP Address和Filesystem,但今天我在验证HA切换时,发现service一直停 ...

  7. web网站——理论01

    LAMP的架构以及通信过程 LAMP的架构: LAMP是一个多C/S架构的平台,最初级为web客户端基于TCP/IP通过http协议发起传送,这个请求可能是动态的,也可能是静态的. 所以web服务器通 ...

  8. h5页面在浏览器上好好的,到手机上熄火了又看不到报错信息怎么办?

    背景 最近小编接了一个新需求,用h5开发页面,通过webview嵌入原生APP中,自己在浏览器上开发爽歪歪,什么信息都能看到,可是一嵌入原生app中,瞬间就熄火了,啥也看不到了,不知道为什么,反正就是 ...

  9. php判断请求方式

    1 /** 2 * 判断是否为get请求 3 * 4 * @return bool 5 */ 6 function is_get():bool 7 { 8 return $_SERVER['REQUE ...

  10. 执行引擎(Execution Engine)基础知识

    概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.缓存.指令集和操作系统 ...