Java生成艺术二维码也可以很简单
现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微信、支付宝的收款码);偶尔也可能看到一些酷炫的二维码,比如非黑白的、渐变色的、非方块样式的,或者说是动态的二维码
那么问题来了,走位一个 java 开发者而言,有没有什么开源库,可以简单迅速不烧脑的实现各种炫酷的二维码呢?
接下来我们将介绍下,如何借助 https://github.com/liuyueyi/quick-media 项目的 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>
添加依赖之后,我们就可以愉快的玩耍了
2. 实例演示
接下来我们通过一系列的实例代码,来演示如何生成各种酷炫的二维码
a. 基本二维码
生成一个最常见的最普通的二维码,并保存到qr.png文件,一行代码即可
String msg = "https://weixin.qq.com/r/FS9waAPEg178rUcL93oH";
// 生成二维码,并输出为qr.png图片
boolean ans = QrCodeGenWrapper.of(msg).asFile("qr.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");
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");
下图展示了四张带 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");
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");
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");
使用这种方式,需要稍微注意一下
- 必须制定 DrawStyle 为图片模式
addImg(row, column, img)来声明素材对应的应用场景,这个表示当出现一个 row 行,column 列都有信息时,用 img 来填充
下面是一个是 quick-media 提供的两种样式模板
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");
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");
II. 其他
1. 一灰灰 Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰 Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰 blog
Java生成艺术二维码也可以很简单的更多相关文章
- Java 生成在线二维码 以Base64返回前端、或者写入到本地磁盘
思路 现阶段遇到这样一个问题,在原有的产品上加入线下优惠券模式,用户领取优惠券以后,获取到一个唯一的ID作为领取凭证,但是在线下用扫码枪进行扫码的时候,总不能让人手动输入吧 于是乎就想出了一个办法,后 ...
- Java生成微信二维码及logo二维码
依赖jar包 二维码的实现有多种方法,比如 Google 的 zxing 和日本公司的 QrCode,本文以 QrCode 为例. QrCode.jar:https://pan.baidu.com/s ...
- 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 ...
- java 生成/解读 二维码
package com.rails.util; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; ...
- Java生成条码二维码
一.概述 可用barcode4j或zxing等第三方库,推荐zxing. barcode4j资料链接:http://barcode4j.sourceforge.net/ zxing资料链接:https ...
- 使用zxing生成解析二维码
1. 前言 随着移动互联网的发展,我们经常在火车票.汽车票.快餐店.电影院.团购网站以及移动支付等各个场景下见到二维码的应用,可见二维码以经渗透到人们生活的各个方面.条码.二维码以及RFID被人们应用 ...
- Android应用--QR的生成(二维码)
二维码的定义: 二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的. 在许多种类的二维条码中,常用的码制 ...
- Pyqt+QRcode 生成 识别 二维码
1.生成二维码 python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrco ...
随机推荐
- js生成随机密码,密码位数自定
话不多说,上代码 function pb(size){ var seed = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N', ...
- log4j2 配置文件解读
1.日志相关介绍 日志接口(slf4j):slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用,比如log4j.l ...
- PHP常用的魔术方法及规则
1. __construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行.2. __desstruct 对象的所有引用都被删除或者当对象被显式销毁时执行.3.__call()在对 ...
- 洛谷p2672推销员题解
日常扯废话: 话说题解里的思路都写得真的是很奈斯啊 但是 代码看不懂确实让人头疼(可能是我太弱了) 就像题解里的第一篇题解代码简洁但是属实看不明白 趁着学姐刚给我讲了知识还热乎赶紧给泥萌说说哈 正文: ...
- 【Wannafly挑战赛24E】旅行
[Wannafly挑战赛24E]旅行 题面 牛客 题解 首先有一个非常显然的\(dp\):我们直接把\(s\rightarrow t\)的路径抠出来然后设\(f_{i,j}\)表示到第\(i\)个点, ...
- Xilinx ISE中使用Synplify综合报错的原因之二
今天发现,不同的器件型号下由IP core生成的模块有时不通用,在实现(implementation)时会出现translate错误.
- BDD的概念
BDD的概念Behavior-Driven Development (BDD) is a set of software engineering practices designed to help ...
- Excel中筛选两个表中相同的数据和快速填充一列的公式
将两个工作表放在一个文件中,使用if函数和countif函数判断 =if(判断条件countif(区域,条件),真值,[假值]) 实例 =if(countif(Sheet2!$A$1:$A$44,A2 ...
- 线程池ScheduledThreadPoolExecutor
Java中调度线程池ScheduledThreadPoolExecutor原理探究 一. 前言 前面讲解过Java中线程池ThreadPoolExecutor原理探究,ThreadPoolExecut ...
- Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解
Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解 题目地址:https://codingcompetitions.withgoogle.com/kickstar ...