转载地址:点击打开链接

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字、图片、网址等信息的条码图片。如下图

二维码的特点:

1.  高密度编码,信息容量大

可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。

2.  编码范围广

该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。

3.  容错能力强,具有纠错功能

这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。

4.  译码可靠性高

它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。

5.  可引入加密措施

保密性、防伪性好。

6.  成本低,易制作,持久耐用

正因为以上这些特点,二维码现在越来越流行,应用也是越来越广(详细了解请见百度百科,介绍不是本篇重点),所以掌握如何开发二维码是非常不错的知识储备,因此本篇博文将为大家讲解如何生成、解析二维码。

所需jar包:QRCode.jar

http://download.csdn.net/detail/wangpeng047/4008532

TwoDimensionCode类:二维码操作核心类

  1. package qrcode;
  2. import java.awt.Color;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import javax.imageio.ImageIO;
  10. import jp.sourceforge.qrcode.QRCodeDecoder;
  11. import jp.sourceforge.qrcode.exception.DecodingFailedException;
  12. import com.swetake.util.Qrcode;
  13. public class TwoDimensionCode {
  14. /**
  15. * 生成二维码(QRCode)图片
  16. * @param content 存储内容
  17. * @param imgPath 图片路径
  18. */
  19. public void encoderQRCode(String content, String imgPath) {
  20. this.encoderQRCode(content, imgPath, "png", 7);
  21. }
  22. /**
  23. * 生成二维码(QRCode)图片
  24. * @param content 存储内容
  25. * @param output 输出流
  26. */
  27. public void encoderQRCode(String content, OutputStream output) {
  28. this.encoderQRCode(content, output, "png", 7);
  29. }
  30. /**
  31. * 生成二维码(QRCode)图片
  32. * @param content 存储内容
  33. * @param imgPath 图片路径
  34. * @param imgType 图片类型
  35. */
  36. public void encoderQRCode(String content, String imgPath, String imgType) {
  37. this.encoderQRCode(content, imgPath, imgType, 7);
  38. }
  39. /**
  40. * 生成二维码(QRCode)图片
  41. * @param content 存储内容
  42. * @param output 输出流
  43. * @param imgType 图片类型
  44. */
  45. public void encoderQRCode(String content, OutputStream output, String imgType) {
  46. this.encoderQRCode(content, output, imgType, 7);
  47. }
  48. /**
  49. * 生成二维码(QRCode)图片
  50. * @param content 存储内容
  51. * @param imgPath 图片路径
  52. * @param imgType 图片类型
  53. * @param size 二维码尺寸
  54. */
  55. public void encoderQRCode(String content, String imgPath, String imgType, int size) {
  56. try {
  57. BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
  58. File imgFile = new File(imgPath);
  59. // 生成二维码QRCode图片
  60. ImageIO.write(bufImg, imgType, imgFile);
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. /**
  66. * 生成二维码(QRCode)图片
  67. * @param content 存储内容
  68. * @param output 输出流
  69. * @param imgType 图片类型
  70. * @param size 二维码尺寸
  71. */
  72. public void encoderQRCode(String content, OutputStream output, String imgType, int size) {
  73. try {
  74. BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);
  75. // 生成二维码QRCode图片
  76. ImageIO.write(bufImg, imgType, output);
  77. } catch (Exception e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. /**
  82. * 生成二维码(QRCode)图片的公共方法
  83. * @param content 存储内容
  84. * @param imgType 图片类型
  85. * @param size 二维码尺寸
  86. * @return
  87. */
  88. private BufferedImage qRCodeCommon(String content, String imgType, int size) {
  89. BufferedImage bufImg = null;
  90. try {
  91. Qrcode qrcodeHandler = new Qrcode();
  92. // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
  93. qrcodeHandler.setQrcodeErrorCorrect('M');
  94. qrcodeHandler.setQrcodeEncodeMode('B');
  95. // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
  96. qrcodeHandler.setQrcodeVersion(size);
  97. // 获得内容的字节数组,设置编码格式
  98. byte[] contentBytes = content.getBytes("utf-8");
  99. // 图片尺寸
  100. int imgSize = 67 + 12 * (size - 1);
  101. bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);
  102. Graphics2D gs = bufImg.createGraphics();
  103. // 设置背景颜色
  104. gs.setBackground(Color.WHITE);
  105. gs.clearRect(0, 0, imgSize, imgSize);
  106. // 设定图像颜色> BLACK
  107. gs.setColor(Color.BLACK);
  108. // 设置偏移量,不设置可能导致解析出错
  109. int pixoff = 2;
  110. // 输出内容> 二维码
  111. if (contentBytes.length > 0 && contentBytes.length < 800) {
  112. boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
  113. for (int i = 0; i < codeOut.length; i++) {
  114. for (int j = 0; j < codeOut.length; j++) {
  115. if (codeOut[j][i]) {
  116. gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
  117. }
  118. }
  119. }
  120. } else {
  121. throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");
  122. }
  123. gs.dispose();
  124. bufImg.flush();
  125. } catch (Exception e) {
  126. e.printStackTrace();
  127. }
  128. return bufImg;
  129. }
  130. /**
  131. * 解析二维码(QRCode)
  132. * @param imgPath 图片路径
  133. * @return
  134. */
  135. public String decoderQRCode(String imgPath) {
  136. // QRCode 二维码图片的文件
  137. File imageFile = new File(imgPath);
  138. BufferedImage bufImg = null;
  139. String content = null;
  140. try {
  141. bufImg = ImageIO.read(imageFile);
  142. QRCodeDecoder decoder = new QRCodeDecoder();
  143. content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
  144. } catch (IOException e) {
  145. System.out.println("Error: " + e.getMessage());
  146. e.printStackTrace();
  147. } catch (DecodingFailedException dfe) {
  148. System.out.println("Error: " + dfe.getMessage());
  149. dfe.printStackTrace();
  150. }
  151. return content;
  152. }
  153. /**
  154. * 解析二维码(QRCode)
  155. * @param input 输入流
  156. * @return
  157. */
  158. public String decoderQRCode(InputStream input) {
  159. BufferedImage bufImg = null;
  160. String content = null;
  161. try {
  162. bufImg = ImageIO.read(input);
  163. QRCodeDecoder decoder = new QRCodeDecoder();
  164. content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");
  165. } catch (IOException e) {
  166. System.out.println("Error: " + e.getMessage());
  167. e.printStackTrace();
  168. } catch (DecodingFailedException dfe) {
  169. System.out.println("Error: " + dfe.getMessage());
  170. dfe.printStackTrace();
  171. }
  172. return content;
  173. }
  174. public static void main(String[] args) {
  175. String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";
  176. String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ http://sjsky.iteye.com ]" + "\nEMail [ sjsky007@gmail.com ]";
  177. TwoDimensionCode handler = new TwoDimensionCode();
  178. handler.encoderQRCode(encoderContent, imgPath, "png");
  179. //      try {
  180. //          OutputStream output = new FileOutputStream(imgPath);
  181. //          handler.encoderQRCode(content, output);
  182. //      } catch (Exception e) {
  183. //          e.printStackTrace();
  184. //      }
  185. System.out.println("========encoder success");
  186. String decoderContent = handler.decoderQRCode(imgPath);
  187. System.out.println("解析结果如下:");
  188. System.out.println(decoderContent);
  189. System.out.println("========decoder success!!!");
  190. }
  191. }

TwoDimensionCodeImage 类:二维码图片对象

  1. package qrcode;
  2. import java.awt.image.BufferedImage;
  3. import jp.sourceforge.qrcode.data.QRCodeImage;
  4. public class TwoDimensionCodeImage implements QRCodeImage {
  5. BufferedImage bufImg;
  6. public TwoDimensionCodeImage(BufferedImage bufImg) {
  7. this.bufImg = bufImg;
  8. }
  9. @Override
  10. public int getHeight() {
  11. return bufImg.getHeight();
  12. }
  13. @Override
  14. public int getPixel(int x, int y) {
  15. return bufImg.getRGB(x, y);
  16. }
  17. @Override
  18. public int getWidth() {
  19. return bufImg.getWidth();
  20. }
  21. }

上面的java代码,笔者已经进行了简单的封装,方便大家适用不同场合,希望对大家能有所帮助。

[转]java二维码生成与解析代码实现的更多相关文章

  1. java二维码生成与解析代码实现

    TwoDimensionCode类:二维码操作核心类 package qrcode; import java.awt.Color; import java.awt.Graphics2D; import ...

  2. java zxing实现二维码生成和解析zxing实现二维码生成和解析

    原文:https://www.cnblogs.com/zhangzhen894095789/p/6623041.html zxing实现二维码生成和解析   二维码 zxing   二维码的生成与解析 ...

  3. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  4. Java二维码生成与解码

      基于google zxing 的Java二维码生成与解码   一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...

  5. java利用Google Zxing实现 二维码生成与解析

    1.引入zxing 2.使用下面两个类:QRCodeUtil.java和BufferedImageLuminanceSource.java 3.新建单元测试类 复制下面测试代码即可. 1.pom文件中 ...

  6. 你不可错过的二维码生成与解析-java后台与前端js都有

    1.二维码分类   二维条码也有许多不同的码制,就码制的编码原理而言,通常分为三种类型. 线性堆叠式二维码 编码原理: 建立在一维条码基础之上,按需要堆积成两行或多行. 图示: 矩阵式二维码 最常用编 ...

  7. 带logo图片或不带logo图片的二维码生成与解析,亲测成功

    最近公司需要实现二维码功能,本人经过一顿百度,终于实现了,因有3个功能:不带logo图片.带logo图片.解析二维码,篇幅较长,请耐心读之,直接复制粘贴即可. 前提:myeclipse10:jar包: ...

  8. java 二维码生成(可带图片)springboot版

    本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样, ...

  9. java 二维码生成

    直接上代码: 二维码生成核心类: package com.bbkj.wechat.tool; import java.awt.image.BufferedImage; import java.io.F ...

随机推荐

  1. lua元表与元方法

    lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完 ...

  2. ORA-12519: TNS:no appropriate service handler found 解决(转)

    可能是数据库上当前的连接数目已经超过了它能够处理的最大值. select count(*) from v$process --当前的连接数 select value from v$parameter  ...

  3. 第一章-第六题(帮人抢票,帮人选课这些软件是否合法 你怎么看?)--By梁旭晖

    我觉得这些软件是合法的,符合道德规范的. 计算机当初设计的初衷就是简化甚至替代人类的工作.而软件作为计算机硬件的驱动着,其设计就是体现这些原则. 现在互联网上的订票,选课类型的网站还是有很多的,比如: ...

  4. 使用github的使用,利用git shell命令行模式进行操作

    一.登录到git,新建一个版本仓库 二.在"Repository name"一栏里填写版本仓库的名称,如"test",Description栏是描述,可填可不填 ...

  5. Thinkphp控制器,1.多层控制器2.多级控制器

    1.多层控制器 ThinkPHP的控制器支持多层和多级,多层指的是控制器可以分层,例如除了默认的Controller控制器层(我们可以称之为访问控制器),还可以添加事件控制器(层),例如: ├─Con ...

  6. 《linux内核设计与实现》读书笔记第十七章

    第17章 设备与模块 四种内核成分 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向 ...

  7. CSS中有关水平居中和垂直居中的解决办法

    CCS中让div等块级元素在父级元素中居中的方法: (1)div{  margin:0 auto   } 该方法只能实现水平的居中,无法实现元素的垂直居中 (2)当div元素的宽高是固定的,然后设置位 ...

  8. smarty中使用truncate出现乱码,用mb_substr解决

  9. SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表

    该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处. 触发器要实现的功能: (1)获取对表Table1数据操作操作类型(insert. ...

  10. NSInternalInconsistencyException

    2016-09-10 12:48:13.281 Friend[92304:1843372] *** Terminating app due to uncaught exception 'NSInter ...