现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个logo,或者将二维码嵌在一张特定的背景中(比如微信、支付宝的收款码);偶尔也可能看到一些酷炫的二维码,比如非黑白的、渐变色的、非方块样式的,或者说是动态的二维码
那么问题来了,走位一个java开发者而言,有没有什么开源库,可以简单迅速不烧脑的实现各种炫酷的二维码呢?
接下来我们将介绍下,如何借助 https://github.com/liuyueyi/quick-media 项目的 qrcode-plugin
来生成各种酷炫的二维码
1. 配置
我们主要使用的quick-media
项目其中的一个插件:qrcode-plugin
,目前已提供maven的引入方式,最新版本为2.1
1 2 3 4 5 6 7 8 9 10 11 12 13
| <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>
|
添加依赖之后,我们就可以愉快的玩耍了
2. 实例演示
接下来我们通过一系列的实例代码,来演示如何生成各种酷炫的二维码
a. 基本二维码
生成一个最常见的最普通的二维码,并保存到qr.png
文件,一行代码即可
1 2 3
| String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
boolean ans = QrCodeGenWrapper.of(msg).asFile("qr.png");
|
b. 颜色指定
默认的二维码为白底黑块,如果我希望生成白底蓝块(探测图形外青内红)的二维码,可以如下使用
1 2 3 4 5 6 7 8 9 10 11 12
| 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");
|
c. 带logo二维码生成
logo目前支持两种样式,一个是圆角logo,一个是直接原图不做处理;下面是一个简单的圆角logo,并带上边框的实例
1 2 3 4 5 6 7 8 9 10 11
| 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"); `
|
下图展示了四张带logo的二维码
- 原始logo
- 直角带logo背景色
- 圆角带logo背景色
- 圆角带logo背景,边框
d. 指定背景图
背景图目前支持三种样式,分别是二维码全覆盖在背景图上,在背景图的自定区间进行绘制二维码,生成透明二维码但使用背景图进行渲染,下面
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
| 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");
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");
|
e. 几何样式二维码生成
默认的二维码的信息为黑色小方块,本插件提供了其他的几个常见的几何形式支持,如圆点,三角,钻石,六边形,八边形;通过指定DrawStyle参数即可
1 2 3 4 5 6 7
| 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");
|
f. 图片填充
如果你有一套完整的素材,那么可以考虑用这些素材来生成一个更漂亮的二维码;
比如项目的测试中,给出了两套输出,一个爱心,一个集合图形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH"; int size = 500; boolean ans = QrCodeGenWrapper.of(msg) .setW(size) .setH(size) .setErrorCorrection(ErrorCorrectionLevel.H) .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");
|
使用这种方式,需要稍微注意一下
- 必须制定DrawStyle为图片模式
addImg(row, column, img)
来声明素材对应的应用场景,这个表示当出现一个row行,column列都有信息时,用img来填充
下面是一个是quick-media提供的两种样式模板
g. 动态二维码
接下来介绍一下动态二维码的生成,和背景图的使用姿势基本上完全以往,唯一的区别就是背景图为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
| 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");
|
h. 综合
上面的几种case,是可以组合使用的,最后给一个综合的”求关注”动态二维码的生成实例
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
| String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
String bg = "https://ww1.sinaimg.cn/large/8154e929gy1g8w9jsxwtdg20pz08zwr8.gif";
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");
|
II. 其他
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注
一灰灰blog
知识星球