JDK 版本 |
---|
zxing 版本 |
---|
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.1</version>
</dependency>
Google
的zxing
是一套相当不错的二维码处理工具,当然它不仅仅可以处理二维码,还可以处理包括UPC_A
、PDF_417
在内的其他条形码。
由于zxing
只提供了简单的二维码生成方式,所以自己将这种生成方式进行了简单封装并进一步对功能进行增强。现在简单介绍一下封装之后增强的功能以及使用方法:
根据文本内容直接生成二维码
QRCode qrCode = new QRCodeBuilder()
.content("http://blog.csdn.net/rekadowney")
.create();
qrCode.writeTo(new File("F:/qrcode.png"));
此时生成的二维码为: |
---|
![]() |
使用方法相当简单,直接通过QRCodeBuilder
来创建QRCode
就可以得到二维码的基本信息了,之后调用writeTo
方法将二维码生成到指定文件中。
接下来试试更多可选配置并将一张图片作为logo
添加到二维码的右下角
QRCode qrCode = new QRCodeBuilder()
.content("http://blog.csdn.net/rekadowney")
.size(400)
.withOnColor(Color.BLUE)
.withOffColor(Color.GREEN)
.withImageType(ImageType.JPEG)
.logo(new File("F:/logo.jpg"))
.logoLocation(LogoLocation.RIGHT_BOTTOM)
.logoRoundRectangle() // 绘制 logo 的圆角矩形边框
.create();
qrCode.writeTo(new File("F:/qrcode.jpg"));
其中logo 文件为: |
---|
![]() |
生成的二维码为: |
---|
![]() |
这里使用withOnColor
和withOffColor
指定二维码的上色方案(默认是黑白相间的),上色方案的色差越大,扫描速度越快,因此没有必要建议黑白相间最好;通过size
方法订制二维码的尺寸为400*400;其他方法都可以明显看出它所对应的功能,这里就不解释了。最后生成的二维码中logo
有点偏差,这个之后再说。
最后再试试通过文本直接生成logo
QRCode qrCode = new QRCodeBuilder()
.content("http://blog.csdn.net/rekadowney")
.size(400)
.withImageType(ImageType.GIF)
.labelAsLogo("雷卡")
.logoRoundRectangle()
.create();
qrCode.writeTo(new File("F:/qrcode.gif"));
此时生成的二维码为: |
---|
![]() |
通过labelAsLogo
方法将指定的文本生成logo
,默认logo
居中显示。需要注意的是:一旦要使用文本logo
,请勿必不要添加图片logo
,因为默认会优先选择图片logo
,所以此时如果你既选择了图片logo
又选择了文本logo
,那么将只渲染图片logo
。
可以看到我封装并增强的内容主要有:
- 封装二维码配置生成过程
- 增强
图片logo
增强
文本logo
该封装过程主要使用的是创建者模式,通过创建者模式提供大量的默认配置,尽可能的保证生成
QRCode
实例是不可变的。但目前封装的还是有些不好的地方,罗列如下:logo
收缩尺寸时不正确
提供了一个scaledLogo
方法将过大的logo
自动收缩成适合二维码的尺寸,但是发现不太理想。后面如果自己写的收缩功能依然解决不好的话,可能会考虑采用Thumbnails
等缩略图工具来收缩。logo
的方位不准确
从上述的图片logo
可以看出,这个原因也大概了解了一下,主要是在理解zxing
对quietZone
的渲染的像素计算上有偏差。本来还提供了一个margin
方法可以配置二维码的留白区域大小,但是因为计算一直出错,所以先搁置了,有机会再看看com.google.zxing.qrcode.QRCodeWriter#renderResult
这个方法的具体计算。文本logo
的着色方案不正常
本来在渲染文本logo
的时候,可以通过LabelConfig
这个类配置着色方案,字体及字号,但是渲染完毕之后再绘制到二维码上就变成了一团看不清楚的浓墨了(默认白底黑字没问题)。
我是这样绘制文本logo
的:通过Graphics2D
将文本转换成BufferedImage
,之后再将BufferedImage
渲染到二维码上。
我试过直接将BufferedImage
先输出到图片文件上,看了一下输出的图片好像颜色不太正常;之后再把这个图片文件作为图片logo
渲染到二维码上,这时候二维码上的logo
颜色反而是正确的。但是如果我直接在代码里将BufferedImage
存到临时文件再读出来渲染时又变成浓墨了!这个还真不知道怎么回事?主要是我对Grapics2D
图画绘制类不熟悉,如果有用过的同学可以讲一下该怎么做。
代码的编写风格主要参考了Gson
、另外还借鉴并参考了如下两个依赖的部分方法命名:
<dependency>
<groupId>com.xiongyingqi</groupId>
<artifactId>qrcode</artifactId>
<version>0.1.10</version>
</dependency>
<dependency>
<groupId>net.glxn</groupId>
<artifactId>qrgen</artifactId>
<version>1.4</version>
</dependency>
原创声明:
本文为个人原创,如有错误与不妥,欢迎提出!
另外,未经许可,谢绝转载。
编写日期:2016-08-24 |
发布日期:2016-08-24 |