简单封装Google的二维码生成/解析工具——zxing

JDK版本

JDK版本.jpg

zxing版本
    <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.2.1</version>
    </dependency>

  Googlezxing是一套相当不错的二维码处理工具,当然它不仅仅可以处理二维码,还可以处理包括UPC_APDF_417在内的其他条形码。
  由于zxing只提供了简单的二维码生成方式,所以自己将这种生成方式进行了简单封装并进一步对功能进行增强。现在简单介绍一下封装之后增强的功能以及使用方法:

根据文本内容直接生成二维码

   QRCode qrCode = new QRCodeBuilder()
           .content("http://blog.csdn.net/rekadowney")
           .create();
   qrCode.writeTo(new File("F:/qrcode.png"));
此时生成的二维码为:
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文件为:
logo.jpg
生成的二维码为:
qrcode.jpg

  这里使用withOnColorwithOffColor指定二维码的上色方案(默认是黑白相间的),上色方案的色差越大,扫描速度越快,因此没有必要建议黑白相间最好;通过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"));
此时生成的二维码为:
qrcode.gif

  
  通过labelAsLogo方法将指定的文本生成logo,默认logo居中显示。需要注意的是:一旦要使用文本logo,请勿必不要添加图片logo,因为默认会优先选择图片logo,所以此时如果你既选择了图片logo又选择了文本logo,那么将只渲染图片logo


  可以看到我封装并增强的内容主要有:

  • 封装二维码配置生成过程
  • 增强图片logo
  • 增强文本logo

      该封装过程主要使用的是创建者模式,通过创建者模式提供大量的默认配置,尽可能的保证生成QRCode实例是不可变的。但目前封装的还是有些不好的地方,罗列如下:

  • logo收缩尺寸时不正确
      提供了一个scaledLogo方法将过大的logo自动收缩成适合二维码的尺寸,但是发现不太理想。后面如果自己写的收缩功能依然解决不好的话,可能会考虑采用Thumbnails等缩略图工具来收缩。

  • logo的方位不准确
      从上述的图片logo可以看出,这个原因也大概了解了一下,主要是在理解zxingquietZone的渲染的像素计算上有偏差。本来还提供了一个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>

原创声明:
本文为个人原创,如有错误与不妥,欢迎提出!
另外,未经许可,谢绝转载。

源码地址1:Git@OSC

源码地址2:GitHub

编写日期:2016-08-24
发布日期:2016-08-24
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值