一灰灰blog 一灰灰blog
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)

一灰灰blog

资深搬运工
首页
  • InfluxDB
  • MongoDB
  • MySql
  • 基础系列
  • DB系列
  • 搜索系列
  • MQ系列
  • WEB系列
  • 中间件
  • 运维
  • SpringSecurity
  • SpringCloud
  • QuickAlarm
  • QuickCrawer
  • QuickFix
  • QuickMedia
  • QuickSpi
  • QuickTask
  • 分类
  • 标签
  • 归档
  • 收藏
  • 关于
GitHub (opens new window)
  • QuickAlarm

  • QuickCrawer

  • QuickFix

  • QuickMedia

    • Java 借助ImageMagic实现图片编辑服务
    • Quick-Media-Java生成艺术二维码也可以很简单
      • II. 其他
        • 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
        • 2. 声明
        • 3. 扫描关注
    • Quick-Media-中文二维码支持
    • Quick-Media-前置渲染模板支持
    • QuickMedia升级2.6.0
    • Quick-Media-中秋到了,是时候给你的二维码加个月饼了
  • QuickSpi

  • QuickTask

  • Quick开源系列
  • QuickMedia
一灰灰
2019-11-13

Quick-Media-Java生成艺术二维码也可以很简单

现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个logo,或者将二维码嵌在一张特定的背景中(比如微信、支付宝的收款码);偶尔也可能看到一些酷炫的二维码,比如非黑白的、渐变色的、非方块样式的,或者说是动态的二维码

那么问题来了,走位一个java开发者而言,有没有什么开源库,可以简单迅速不烧脑的实现各种炫酷的二维码呢?

接下来我们将介绍下,如何借助 https://github.com/liuyueyi/quick-media (opens new window) 项目的 qrcode-plugin 来生成各种酷炫的二维码

# 1. 配置

我们主要使用的quick-media项目其中的一个插件:qrcode-plugin,目前已提供maven的引入方式,最新版本为2.1

<repositories>
    <repository>
        <id>yihui-maven-repo</id>
        <url>https://raw.githubusercontent.com/liuyueyi/maven-repository/master/repository</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.github.hui.media</groupId>
    <artifactId>qrcode-plugin</artifactId>
    <version>2.2</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13

添加依赖之后,我们就可以愉快的玩耍了

# 2. 实例演示

接下来我们通过一系列的实例代码,来演示如何生成各种酷炫的二维码

# a. 基本二维码

生成一个最常见的最普通的二维码,并保存到qr.png文件,一行代码即可

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
// 生成二维码,并输出为qr.png图片
boolean ans = QrCodeGenWrapper.of(msg).asFile("qr.png");
1
2
3

dq.png

# b. 颜色指定

默认的二维码为白底黑块,如果我希望生成白底蓝块(探测图形外青内红)的二维码,可以如下使用

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
boolean ans = QrCodeGenWrapper.of(msg)
        .setW(300)
        // 定位点(探测图形)外边颜色
        .setDetectOutColor(Color.CYAN)
        // 定位点内部颜色
        .setDetectInColor(Color.RED)
        // 二维码着色点
        .setDrawPreColor(Color.BLUE)
        // 二维码背景图
        .setDrawBgColor(0xffffffff)
        .asFile("/tmp/cqr.png");
1
2
3
4
5
6
7
8
9
10
11
12

cqr.png

# c. 带logo二维码生成

logo目前支持两种样式,一个是圆角logo,一个是直接原图不做处理;下面是一个简单的圆角logo,并带上边框的实例

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
// 这里的图片地址,支持网络图片,本地相对路劲图片,本地绝对路径图片
String logo = "https://static.oschina.net/uploads/user/283/566591_100.jpeg";
boolean ans = QrCodeGenWrapper.of(msg)
        .setLogo(logo)
        .setLogoStyle(QrCodeOptions.LogoStyle.ROUND)
        .setLogoBgColor(0xfffefefe)
        .setLogoBorderBgColor(0xffc7c7c7)
        .setLogoBorder(true)
        .asFile("/tmp/lqr3.png");
1
2
3
4
5
6
7
8
9
10

下图展示了四张带logo的二维码

  • 原始logo
  • 直角带logo背景色
  • 圆角带logo背景色
  • 圆角带logo背景,边框

logo

# d. 指定背景图

背景图目前支持三种样式,分别是二维码全覆盖在背景图上,在背景图的自定区间进行绘制二维码,生成透明二维码但使用背景图进行渲染,下面

// 默认属于全覆盖的背景模式,对应下图中左图
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8vho8x6r0j20b40b43yl.jpg";
boolean ans = QrCodeGenWrapper.of(msg)
        .setBgImg(bg)
        .setW(500)
        .setBgOpacity(0.5f)
        .asFile("/tmp/bqr1.png");

// 指定为填充模式,在背景图的坐标(startX, startY)处绘制二维码(左上角坐标为0,0; 对应下图中的中图        
bg = "https://pic.51yuansu.com/pic3/cover/01/07/09/59015a0e53d83_610.jpg";
ans = QrCodeGenWrapper.of(msg)
        .setBgImg(bg)
        .setBgStyle(QrCodeOptions.BgImgStyle.FILL)
        .setBgW(500)
        .setBgH(500)
        .setBgStartX(130)
        .setBgStartY(120)
        .setW(260)
        .setPadding(0)
        .setDrawBgColor(0xfff7f7f7)
        .asFile("/tmp/bqr2.png");
        
// 背景渲染方式,用背景图来填充二维码,对应下图中的右图
bg = "https://img1.juimg.com/180517/355855-1P51H3520817.jpg";
ans = QrCodeGenWrapper.of(msg)
        .setBgImg(bg)
        .setBgStyle(QrCodeOptions.BgImgStyle.PENETRATE)
        .setBgW(500)
        .setBgH(500)
        .setW(500)
        .asFile("/tmp/bqr3.png");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

bqr

# e. 几何样式二维码生成

默认的二维码的信息为黑色小方块,本插件提供了其他的几个常见的几何形式支持,如圆点,三角,钻石,六边形,八边形;通过指定DrawStyle参数即可

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
boolean ans = QrCodeGenWrapper.of(msg)
        .setW(400)
        // 支持将临近相同的合并成一个大的圆点
        .setDrawEnableScale(true)
        .setDrawStyle(QrCodeOptions.DrawStyle.CIRCLE)
        .asFile("/tmp/dqr6.png");
1
2
3
4
5
6
7

几何

# f. 图片填充

如果你有一套完整的素材,那么可以考虑用这些素材来生成一个更漂亮的二维码;

比如项目的测试中,给出了两套输出,一个爱心,一个集合图形

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
int size = 500;
boolean ans = QrCodeGenWrapper.of(msg)
        .setW(size)
        .setH(size)
        .setErrorCorrection(ErrorCorrectionLevel.H)
        // 因为素材为png透明图,我们这里设置二维码的背景为透明,输出更加优雅
        .setDrawBgColor(ColorUtil.OPACITY)
        .setDetectImg("jihe/PDP.png")
        .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE)
        .addImg(1, 1, "jihe/a.png")
        .addImg(3, 1, "jihe/b.png")
        .addImg(1, 3, "jihe/c.png")
        .addImg(3, 2, "jihe/e.png")
        .addImg(2, 3, "jihe/f.png")
        .addImg(2, 2, "jihe/g.png")
        .addImg(3, 4, "jihe/h.png")
        .setPicType("png")
        .asFile("/tmp/imgQr1.png");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

使用这种方式,需要稍微注意一下

  • 必须制定DrawStyle为图片模式
  • addImg(row, column, img) 来声明素材对应的应用场景,这个表示当出现一个row行,column列都有信息时,用img来填充

下面是一个是quick-media提供的两种样式模板

imgQr

# g. 动态二维码

接下来介绍一下动态二维码的生成,和背景图的使用姿势基本上完全以往,唯一的区别就是背景图为gif动图

// 全覆盖模式,指定二维码的透明度(如下图左)
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8pq78mcgrg20dw0boaja.gif";
boolean ans = QrCodeGenWrapper.of(msg)
        .setW(500)
        .setBgImg(bg)
        .setBgOpacity(0.6f)
        .setPicType("gif")
        .asFile("/tmp/gifQr1.gif");
                    

// 填充模式,在背景图的指定位置上绘制二维码,属于常见的一种动图模式(如下图中)
bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8qe2iv0evg20xc0irn68.gif";
boolean ans = QrCodeGenWrapper.of(msg)
      .setW(400)
      .setBgImg(bg)
      .setBgStyle(QrCodeOptions.BgImgStyle.FILL)
      .setBgStartX(20)
      .setBgStartY(137)
      .setPicType("gif")
      .asFile("/tmp/gifQr2.gif");

// 背景渲染模式,直接用背景图来填充二维码信息,因此可以实现炫酷的二维码(如下图右)
bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8w7wj6qvsg20oy0io4dt.gif";
boolean ans = QrCodeGenWrapper.of(msg)
      .setBgImg(bg)
      .setBgW(500)
      .setBgH(500)
      .setBgStyle(QrCodeOptions.BgImgStyle.PENETRATE)
      .setW(500)
      .asFile("/tmp/gifQr3.gif");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

list.gif

# h. 综合

上面的几种case,是可以组合使用的,最后给一个综合的"求关注"动态二维码的生成实例

String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
// 网络动图背景
String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8w9jsxwtdg20pz08zwr8.gif";
// 本地logo
String logo = "logo.jpg";
boolean ans = QrCodeGenWrapper.of(msg)
        .setW(500)
        .setDrawBgColor(ColorUtil.OPACITY)
        .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE)
        .setDetectImg("jihe/PDP.png")
        .addImg(1, 1, "jihe/a.png")
        .addImg(3, 1, "jihe/b.png")
        .addImg(1, 3, "jihe/c.png")
        .addImg(3, 2, "jihe/e.png")
        .addImg(2, 3, "jihe/f.png")
        .addImg(2, 2, "jihe/g.png")
        .addImg(3, 4, "jihe/h.png")
        .setPadding(1)
        .setErrorCorrection(ErrorCorrectionLevel.H)
        .setLogo(logo)
        .setLogoBorder(true)
        .setLogoStyle(QrCodeOptions.LogoStyle.ROUND)
        .setLogoBgColor(0xfffefefe)
        .setLogoBorderBgColor(0xffc7c7c7)
        .setBgImg(bg)
        .setBgW(1870)
        .setBgH(646)
        .setBgStyle(QrCodeOptions.BgImgStyle.FILL)
        .setBgStartX(690)
        .setBgStartY(20)
        .setBgOpacity(0.9f)
        .setPicType("gif")
        .asFile("/tmp/gifQr4.gif");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

求关注

# II. 其他

# 1. 一灰灰Blog (opens new window): https://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 项目地址: https://github.com/liuyueyi/quick-media (opens new window)

# 2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

  • 微博地址: 小灰灰Blog (opens new window)
  • QQ: 一灰灰/3302797840

# 3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

编辑 (opens new window)
#二维码
上次更新: 2021/10/15, 19:56:22
Java 借助ImageMagic实现图片编辑服务
Quick-Media-中文二维码支持

← Java 借助ImageMagic实现图片编辑服务 Quick-Media-中文二维码支持→

最近更新
01
【WEB系列】从0到1实现自定义web参数映射器
01-23
02
【WEB系列】如何支持下划线驼峰互转的传参与返回
01-17
03
【DB系列】Mybatis之批量插入的几种姿势
01-11
更多文章>
Theme by Vdoing | Copyright © 2017-2022 一灰灰Blog
MIT License | 鄂ICP备18017282号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×