[转]java二维码生成与解析代码实现

转载地址:点击打开链接

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

二维码的特点:

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

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

2.  编码范围广

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

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

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

4.  译码可靠性高

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

5.  可引入加密措施

保密性、防伪性好。

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

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

所需jar包:QRCode.jar

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

TwoDimensionCode类:二维码操作核心类

[java] view plaincopy

  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 [ [email protected] ]";
  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 类:二维码图片对象

[java] view plaincopy

  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代码,笔者已经进行了简单的封装,方便大家适用不同场合,希望对大家能有所帮助。

时间: 2024-10-13 11:36:26

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

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

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍. 2.  编码范围广 该条码可以把图片.声音.文字.签字.指纹等可以数字化的信息进行编码,用条码表示出来:可以表示多种语言文字:可表示图像数据. 3.  容错能力强,具有纠错功能 这使得二维条码因穿孔.污损等引起局部损坏时,照样可以正确

二维码生成与解析代码实现

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 一.Java 所需jar包:QRCode.jar http://download.csdn.net/detail/wangpeng047/4008532 TwoDimensionCode类:二维码操作核心类 [java] view plaincopy package qrcode; import java.awt.Color; import java.awt.Graphics2D; impo

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

zxing实现二维码生成和解析 二维码 zxing 二维码的生成与解析.有多种途径.我选择用大品牌,google老大的zxing. gitHub链接是(我用的3.0.0,已经是nio了) https://github.com/zxing/zxing/tree/zxing-3.0.0 Java代码   // 其中输出图像和读取图像的类在core包 MultiFormatReader MultiFormatWriter // 生成矩阵的类在javase的包里 MatrixToImageWriter

java二维码生成

二维码,是一种采用黑白相间的平面几何图形经过相应的编码算法来记载文字.图画.网址等信息的条码图画.如下图 二维码的特色: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比一般条码信息容量约高几十倍. 2.  编码规模广 该条码能够把图画.声响.文字.签字.指纹等能够数字化的信息进行编码,用条码表明出来:能够表明多种语言文字:可表明图画数据. 3.  容错能力强,具有纠错功用 这使得二维条码因穿孔.污损等导致部分损坏时,照样能够正确

zxing实现二维码生成和解析

zxing实现二维码生成和解析 博客分类: 二维码 zxing 二维码的生成与解析.有多种途径.我选择用大品牌,google老大的zxing. gitHub链接是(我用的3.0.0,已经是nio了) https://github.com/zxing/zxing/tree/zxing-3.0.0 Java代码   // 其中输出图像和读取图像的类在core包 MultiFormatReader MultiFormatWriter // 生成矩阵的类在javase的包里 MatrixToImageW

Java二维码生成与解码

基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependen

java二维码编码和解析工具类

用到两个jar包: QRCode.jar Qrcodeen.jar package com.banmacoffee.utils; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; imp

Android 开发中使用到二维码生成和解析

二维码生成 二维码解析 在项目的开发中, 使用二维码作为数据传递 交换 已经是常态了! 在这我也讲讲自己在项目开发中使用到的二维码. 生成二维码的开发流程 1 应用google 给我们提供的zxing.jar (建议官网下载) 2 使用zxing.jar 的MultiFormatWriter 类 生成一张二维码图片 核心代码块 /** * 方法说明:生成无图片二维码 */ @SuppressWarnings("unused") private Bitmap createTwoCode(

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

本文(2019年6月29日 飞快的蜗牛博客) 有时候,男人和女人是两个完全不同的世界,男人的玩笑和女人的玩笑也完全是两码事,爱的人完全不了解你,你也不要指望一个女人了解你,所以男的不是要求别人怎么样,是要求自己怎么样,男人更应该对自己好点,照顾好自己是最基本的, 不然你怎么照顾别人,男人是竞争的产物不是吗? 言归正传: 首先加入依赖我的目前依赖是: <!-- 二维码生成 --><dependency> <groupId>com.google.zxing</grou