转载地址:点击打开链接

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

二维码的特点:

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中,我们可以直接使用require(“model_name”)来载入别的文件,文件的后缀名是.lua,载入的时候直接执行那个文件了. 比如:my.lua 文件中 print(“hello wo ...

  2. 第九周 psp

    团队项目PSP 一:表格     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论用户界面 9:50 12:45 35 45 80 分析与 ...

  3. DOS 命令For精解示例

    最基本形态: 在cmd 窗口中:for %I in (command1) do command2 在批处理文件中:for %%I in (command1) do command2 在批处理中,FOR ...

  4. HTML基础篇之列表相关标签和特殊字符实体

    HTML字符实体 常用的字符实体: 实体字符 字符实体 大于号 (>) > 小于号 (<) < 引号 (") " 注册商标(®) ® 版权(© ) © &a ...

  5. 学术作为一种志业 马克斯·韦伯Max Weber。

    注:原内容来自优酷自频带:梁文道 一千零一夜 学术作为一种志业马克斯·韦伯Max Weber. 韦伯是社会学的三大创始人之一.另外两个,一个是法国的涂尔干,还有一个就是我们中国人都知道的马克思.在其& ...

  6. laravel Input Cokkie 的各种方法 超实用!!!

    基本输入 Laravel使用一种简单的方式来访问用户提交的信息. 你可以用统一的方式来访问用户提交的信息,而不用为用户提交信息的方式操心. 获取一个用户提交的值 代码如下: $name = Input ...

  7. jquery autocomplete插件

    jquery autocomplete插件 https://goodies.pixabay.com/jquery/auto-complete/demo.html autocomplete-table ...

  8. vert.x学习(五),用StaticHandler来处理静态文件

    做web开发,css.js.图片等静态资源是必不可少的,那么vert.x又是怎么来加载这些静态资源呢.请看StaticHandler 编写HelloStaticResource.java packag ...

  9. 利用nodeJS实现的网络小爬虫

    var http=require("http");var cheerio=require('cheerio');var url="http://www.imooc.com ...

  10. 【leedcode】 Longest Palindromic Substring

    Given a , and there exists one unique longest palindromic substring. https://leetcode.com/problems/l ...