1.   最近琢磨了一下二维码、一维码的编码、解码方法,感觉googlezxing用起来还是比较方便。
  2.   本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/2071020
  3.  
  4. 一、工具类
  5. Java代码 收藏代码
  6. package com.exam.services.qrcode;
  7.  
  8. import com.google.zxing.BarcodeFormat;
  9. import com.google.zxing.BinaryBitmap;
  10. import com.google.zxing.DecodeHintType;
  11. import com.google.zxing.EncodeHintType;
  12. import com.google.zxing.LuminanceSource;
  13. import com.google.zxing.MultiFormatReader;
  14. import com.google.zxing.MultiFormatWriter;
  15. import com.google.zxing.Result;
  16. import com.google.zxing.WriterException;
  17. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
  18. import com.google.zxing.common.BitMatrix;
  19. import com.google.zxing.common.HybridBinarizer;
  20.  
  21. import javax.imageio.ImageIO;
  22.  
  23. import java.io.File;
  24. import java.io.OutputStream;
  25. import java.io.IOException;
  26. import java.util.Hashtable;
  27. import java.awt.image.BufferedImage;
  28.  
  29. /**
  30. * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。
  31. *
  32. * <br/>
  33. * <br/>
  34. * 作者:wallimn<br/>
  35. * 联系:54871876@qq.com,http://wallimn.iteye.com<br/>
  36. * 时间:2014年5月25日  下午10:33:05<br/>
  37. */
  38. public final class MatrixUtil {
  39.  
  40. private static final String CHARSET = "utf-8";
  41. private static final int BLACK = 0xFF000000;
  42. private static final int WHITE = 0xFFFFFFFF;
  43.  
  44. /**
  45. * 禁止生成实例,生成实例也没有意义。
  46. */
  47. private MatrixUtil() {
  48. }
  49.  
  50. /**
  51. * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。
  52. *
  53. * <br/>
  54. * <br/>
  55. * 作者:wallimn<br/>
  56. * 时间:2014年5月25日  下午10:41:12<br/>
  57. * 联系:54871876@qq.com<br/>
  58. *
  59. * @param text
  60. * @return
  61. */
  62. public static BitMatrix toQRCodeMatrix(String text, Integer width,
  63. Integer height) {
  64. if (width == null || width < 300) {
  65. width = 300;
  66. }
  67.  
  68. if (height == null || height < 300) {
  69. height = 300;
  70. }
  71. // 二维码的图片格式
  72. Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
  73. // 内容所使用编码
  74. hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
  75. BitMatrix bitMatrix = null;
  76. try {
  77. bitMatrix = new MultiFormatWriter().encode(text,
  78. BarcodeFormat.QR_CODE, width, height, hints);
  79. } catch (WriterException e) {
  80. // TODO Auto-generated catch block
  81. e.printStackTrace();
  82. }
  83. // 生成二维码
  84. // File outputFile = new File("d:"+File.separator+"new.gif");
  85. // MatrixUtil.writeToFile(bitMatrix, format, outputFile);
  86. return bitMatrix;
  87. }
  88.  
  89. /**
  90. * 将指定的字符串生成二维码图片。简单的使用示例。
  91. *
  92. * <br/>
  93. * <br/>
  94. * 作者:wallimn<br/>
  95. * 时间:2014年5月25日  下午10:44:52<br/>
  96. * 联系:54871876@qq.com<br/>
  97. *
  98. * @param text
  99. * @param file
  100. * @param format
  101. * @return
  102. */
  103. public boolean toQrcodeFile(String text, File file, String format) {
  104. BitMatrix matrix = toQRCodeMatrix(text, null, null);
  105. if (matrix != null) {
  106. try {
  107. writeToFile(matrix, format, file);
  108. return true;
  109. } catch (IOException e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. }
  113. }
  114. return false;
  115. }
  116.  
  117. /**
  118. * 根据点矩阵生成黑白图。 作者:wallimn<br/>
  119. * 时间:2014年5月25日  下午10:26:22<br/>
  120. * 联系:54871876@qq.com<br/>
  121. */
  122. public static BufferedImage toBufferedImage(BitMatrix matrix) {
  123. int width = matrix.getWidth();
  124. int height = matrix.getHeight();
  125. BufferedImage image = new BufferedImage(width, height,
  126. BufferedImage.TYPE_INT_RGB);
  127. for (int x = 0; x < width; x++) {
  128. for (int y = 0; y < height; y++) {
  129. image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
  130. }
  131. }
  132. return image;
  133. }
  134.  
  135. /**
  136. * 将字符串编成一维条码的矩阵
  137. *
  138. * <br/>
  139. * <br/>
  140. * 作者:wallimn<br/>
  141. * 时间:2014年5月25日  下午10:56:34<br/>
  142. * 联系:54871876@qq.com<br/>
  143. *
  144. * @param str
  145. * @param width
  146. * @param height
  147. * @return
  148. */
  149. public static BitMatrix toBarCodeMatrix(String str, Integer width,
  150. Integer height) {
  151.  
  152. if (width == null || width < 200) {
  153. width = 200;
  154. }
  155.  
  156. if (height == null || height < 50) {
  157. height = 50;
  158. }
  159.  
  160. try {
  161. // 文字编码
  162. Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
  163. hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
  164.  
  165. BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
  166. BarcodeFormat.CODE_128, width, height, hints);
  167.  
  168. return bitMatrix;
  169. } catch (Exception e) {
  170. e.printStackTrace();
  171. }
  172. return null;
  173. }
  174.  
  175. /**
  176. * 根据矩阵、图片格式,生成文件。 作者:wallimn<br/>
  177. * 时间:2014年5月25日  下午10:26:43<br/>
  178. * 联系:54871876@qq.com<br/>
  179. */
  180. public static void writeToFile(BitMatrix matrix, String format, File file)
  181. throws IOException {
  182. BufferedImage image = toBufferedImage(matrix);
  183. if (!ImageIO.write(image, format, file)) {
  184. throw new IOException("Could not write an image of format "
  185. + format + " to " + file);
  186. }
  187. }
  188.  
  189. /**
  190. * 将矩阵写入到输出流中。 作者:wallimn<br/>
  191. * 时间:2014年5月25日  下午10:27:58<br/>
  192. * 联系:54871876@qq.com<br/>
  193. */
  194. public static void writeToStream(BitMatrix matrix, String format,
  195. OutputStream stream) throws IOException {
  196. BufferedImage image = toBufferedImage(matrix);
  197. if (!ImageIO.write(image, format, stream)) {
  198. throw new IOException("Could not write an image of format "
  199. + format);
  200. }
  201. }
  202.  
  203. /**
  204. * 解码,需要javase包。
  205. *
  206. * <br/>
  207. * <br/>
  208. * 作者:wallimn<br/>
  209. * 时间:2014年5月25日  下午11:06:07<br/>
  210. * 联系:54871876@qq.com<br/>
  211. *
  212. * @param file
  213. * @return
  214. */
  215. public static String decode(File file) {
  216.  
  217. BufferedImage image;
  218. try {
  219. if (file == null || file.exists() == false) {
  220. throw new Exception(" File not found:" + file.getPath());
  221. }
  222.  
  223. image = ImageIO.read(file);
  224.  
  225. LuminanceSource source = new BufferedImageLuminanceSource(image);
  226. BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  227.  
  228. Result result;
  229.  
  230. // 解码设置编码方式为:utf-8,
  231. Hashtable hints = new Hashtable();
  232. hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
  233.  
  234. result = new MultiFormatReader().decode(bitmap, hints);
  235.  
  236. return result.getText();
  237.  
  238. } catch (Exception e) {
  239. e.printStackTrace();
  240. }
  241.  
  242. return null;
  243. }
  244. }
  245.  
  246. 二、使用示例
  247. Java代码 收藏代码
  248. package com.exam.services.qrcode;
  249.  
  250. import java.io.File;
  251.  
  252. public class Test {
  253.  
  254. /**
  255. * 测试函数。简单地将指定的字符串生成二维码图片。
  256. *
  257. * <br/><br/>
  258. * 作者:wallimn<br/>
  259. * 时间:2014年5月25日  下午10:30:00<br/>
  260. * 联系:54871876@qq.com<br/>
  261. */
  262. public static void main(String[] args) throws Exception {
  263. String text = "http://wallimn.itey.com";
  264. String result;
  265. String format = "gif";
  266. //生成二维码
  267. File outputFile = new File("d:"+File.separator+"rqcode.gif");
  268. MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile);
  269. result = MatrixUtil.decode(outputFile);
  270. System.out.println(result);
  271.  
  272. outputFile = new File("d:"+File.separator+"barcode.gif");
  273. MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile);
  274.  
  275. result = MatrixUtil.decode(outputFile);
  276. System.out.println(result);
  277. }
  278.  
  279. }

  

  最近琢磨了一下二维码、一维码的编码、解码方法,感觉google的zxing用起来还是比较方便。 
  本人原创,欢迎转载,转载请标注原文地址:http://wallimn.iteye.com/blog/2071020

一、工具类

  1. package com.exam.services.qrcode;
  2. import com.google.zxing.BarcodeFormat;
  3. import com.google.zxing.BinaryBitmap;
  4. import com.google.zxing.DecodeHintType;
  5. import com.google.zxing.EncodeHintType;
  6. import com.google.zxing.LuminanceSource;
  7. import com.google.zxing.MultiFormatReader;
  8. import com.google.zxing.MultiFormatWriter;
  9. import com.google.zxing.Result;
  10. import com.google.zxing.WriterException;
  11. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
  12. import com.google.zxing.common.BitMatrix;
  13. import com.google.zxing.common.HybridBinarizer;
  14. import javax.imageio.ImageIO;
  15. import java.io.File;
  16. import java.io.OutputStream;
  17. import java.io.IOException;
  18. import java.util.Hashtable;
  19. import java.awt.image.BufferedImage;
  20. /**
  21. * 使用ZXing2.3,生成条码的辅助类。可以编码、解码。编码使用code包,解码需要javase包。
  22. *
  23. * <br/>
  24. * <br/>
  25. * 作者:wallimn<br/>
  26. * 联系:54871876@qq.com,http://wallimn.iteye.com<br/>
  27. * 时间:2014年5月25日  下午10:33:05<br/>
  28. */
  29. public final class MatrixUtil {
  30. private static final String CHARSET = "utf-8";
  31. private static final int BLACK = 0xFF000000;
  32. private static final int WHITE = 0xFFFFFFFF;
  33. /**
  34. * 禁止生成实例,生成实例也没有意义。
  35. */
  36. private MatrixUtil() {
  37. }
  38. /**
  39. * 生成矩阵,是一个简单的函数,参数固定,更多的是使用示范。
  40. *
  41. * <br/>
  42. * <br/>
  43. * 作者:wallimn<br/>
  44. * 时间:2014年5月25日  下午10:41:12<br/>
  45. * 联系:54871876@qq.com<br/>
  46. *
  47. * @param text
  48. * @return
  49. */
  50. public static BitMatrix toQRCodeMatrix(String text, Integer width,
  51. Integer height) {
  52. if (width == null || width < 300) {
  53. width = 300;
  54. }
  55. if (height == null || height < 300) {
  56. height = 300;
  57. }
  58. // 二维码的图片格式
  59. Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
  60. // 内容所使用编码
  61. hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
  62. BitMatrix bitMatrix = null;
  63. try {
  64. bitMatrix = new MultiFormatWriter().encode(text,
  65. BarcodeFormat.QR_CODE, width, height, hints);
  66. } catch (WriterException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. // 生成二维码
  71. // File outputFile = new File("d:"+File.separator+"new.gif");
  72. // MatrixUtil.writeToFile(bitMatrix, format, outputFile);
  73. return bitMatrix;
  74. }
  75. /**
  76. * 将指定的字符串生成二维码图片。简单的使用示例。
  77. *
  78. * <br/>
  79. * <br/>
  80. * 作者:wallimn<br/>
  81. * 时间:2014年5月25日  下午10:44:52<br/>
  82. * 联系:54871876@qq.com<br/>
  83. *
  84. * @param text
  85. * @param file
  86. * @param format
  87. * @return
  88. */
  89. public boolean toQrcodeFile(String text, File file, String format) {
  90. BitMatrix matrix = toQRCodeMatrix(text, null, null);
  91. if (matrix != null) {
  92. try {
  93. writeToFile(matrix, format, file);
  94. return true;
  95. } catch (IOException e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. }
  99. }
  100. return false;
  101. }
  102. /**
  103. * 根据点矩阵生成黑白图。 作者:wallimn<br/>
  104. * 时间:2014年5月25日  下午10:26:22<br/>
  105. * 联系:54871876@qq.com<br/>
  106. */
  107. public static BufferedImage toBufferedImage(BitMatrix matrix) {
  108. int width = matrix.getWidth();
  109. int height = matrix.getHeight();
  110. BufferedImage image = new BufferedImage(width, height,
  111. BufferedImage.TYPE_INT_RGB);
  112. for (int x = 0; x < width; x++) {
  113. for (int y = 0; y < height; y++) {
  114. image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
  115. }
  116. }
  117. return image;
  118. }
  119. /**
  120. * 将字符串编成一维条码的矩阵
  121. *
  122. * <br/>
  123. * <br/>
  124. * 作者:wallimn<br/>
  125. * 时间:2014年5月25日  下午10:56:34<br/>
  126. * 联系:54871876@qq.com<br/>
  127. *
  128. * @param str
  129. * @param width
  130. * @param height
  131. * @return
  132. */
  133. public static BitMatrix toBarCodeMatrix(String str, Integer width,
  134. Integer height) {
  135. if (width == null || width < 200) {
  136. width = 200;
  137. }
  138. if (height == null || height < 50) {
  139. height = 50;
  140. }
  141. try {
  142. // 文字编码
  143. Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
  144. hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
  145. BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
  146. BarcodeFormat.CODE_128, width, height, hints);
  147. return bitMatrix;
  148. } catch (Exception e) {
  149. e.printStackTrace();
  150. }
  151. return null;
  152. }
  153. /**
  154. * 根据矩阵、图片格式,生成文件。 作者:wallimn<br/>
  155. * 时间:2014年5月25日  下午10:26:43<br/>
  156. * 联系:54871876@qq.com<br/>
  157. */
  158. public static void writeToFile(BitMatrix matrix, String format, File file)
  159. throws IOException {
  160. BufferedImage image = toBufferedImage(matrix);
  161. if (!ImageIO.write(image, format, file)) {
  162. throw new IOException("Could not write an image of format "
  163. + format + " to " + file);
  164. }
  165. }
  166. /**
  167. * 将矩阵写入到输出流中。 作者:wallimn<br/>
  168. * 时间:2014年5月25日  下午10:27:58<br/>
  169. * 联系:54871876@qq.com<br/>
  170. */
  171. public static void writeToStream(BitMatrix matrix, String format,
  172. OutputStream stream) throws IOException {
  173. BufferedImage image = toBufferedImage(matrix);
  174. if (!ImageIO.write(image, format, stream)) {
  175. throw new IOException("Could not write an image of format "
  176. + format);
  177. }
  178. }
  179. /**
  180. * 解码,需要javase包。
  181. *
  182. * <br/>
  183. * <br/>
  184. * 作者:wallimn<br/>
  185. * 时间:2014年5月25日  下午11:06:07<br/>
  186. * 联系:54871876@qq.com<br/>
  187. *
  188. * @param file
  189. * @return
  190. */
  191. public static String decode(File file) {
  192. BufferedImage image;
  193. try {
  194. if (file == null || file.exists() == false) {
  195. throw new Exception(" File not found:" + file.getPath());
  196. }
  197. image = ImageIO.read(file);
  198. LuminanceSource source = new BufferedImageLuminanceSource(image);
  199. BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  200. Result result;
  201. // 解码设置编码方式为:utf-8,
  202. Hashtable hints = new Hashtable();
  203. hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
  204. result = new MultiFormatReader().decode(bitmap, hints);
  205. return result.getText();
  206. } catch (Exception e) {
  207. e.printStackTrace();
  208. }
  209. return null;
  210. }
  211. }

二、使用示例

  1. package com.exam.services.qrcode;
  2. import java.io.File;
  3. public class Test {
  4. /**
  5. * 测试函数。简单地将指定的字符串生成二维码图片。
  6. *
  7. * <br/><br/>
  8. * 作者:wallimn<br/>
  9. * 时间:2014年5月25日  下午10:30:00<br/>
  10. * 联系:54871876@qq.com<br/>
  11. */
  12. public static void main(String[] args) throws Exception {
  13. String text = "http://wallimn.itey.com";
  14. String result;
  15. String format = "gif";
  16. //生成二维码
  17. File outputFile = new File("d:"+File.separator+"rqcode.gif");
  18. MatrixUtil.writeToFile(MatrixUtil.toQRCodeMatrix(text, null, null), format, outputFile);
  19. result = MatrixUtil.decode(outputFile);
  20. System.out.println(result);
  21. outputFile = new File("d:"+File.separator+"barcode.gif");
  22. MatrixUtil.writeToFile(MatrixUtil.toBarCodeMatrix(text, null, null), format, outputFile);
  23. result = MatrixUtil.decode(outputFile);
  24. System.out.println(result);
  25. }
  26. }

java利用zxing编码解码一维码与二维码的更多相关文章

  1. C# 利用ZXing.Net来生成条形码和二维码

    本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...

  2. ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码

    我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ...

  3. Halcon一维码和二维码的解码步骤和技巧——第11讲

    针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...

  4. 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/14450809 转载请注明出处:http://blog.csdn.net/xiaanming/ ...

  5. Android 基于google Zxing实现对手机中的二维码进行扫描

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 有时候我们有这样子的需求,需要扫描手机中有二维码的的图片,所以今天实现的 ...

  6. .NET使用ZXing.NET生成中间带图片的二维码

    很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客. 把之前的代码封装成函数,以方便理解以及调用. 基于开源的 ZXing.NET 组件,代码如下: 先添加对ZXing.NET的引用,然后 ...

  7. C#使用zxing,zbar,thoughtworkQRcode解析二维码,附源代码

    最近做项目需要解析二维码图片,找了一大圈,发现没有人去整理下开源的几个库案例,花了点时间 做了zxing,zbar和thoughtworkqrcode解析二维码案例,希望大家有帮助. zxing是谷歌 ...

  8. 使用qrcode输入信息生成二维码包含二维码说明信息,点击转化为图片并下载

    说明:输入汉字和数字都可以识别并展示 <body> <h2 id="h2">二维码生成</h2> <br> <span id= ...

  9. asp.net生成店铺推广二维码,二维码中间加logo(源码)

    二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ...

随机推荐

  1. Android Service学习之AIDL, Parcelable和远程服务

    AIDL的作用     由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空 ...

  2. sqlserver 2000事务复制问题

    2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...

  3. javascript_获取iframe框架中元素节点的属性值

    1. DOM:文档对象模型 [window 对象] 它是一个顶层对象,而不是另一个对象的属性即浏览器的窗口. [document 对象] 该对象是window和frames对象的一个属性,是显示于窗口 ...

  4. Win32和MFC项目如何输出调试信息到VS的调试窗口

    直接举例说明: Win32项目: #include <Windows.h> OutputDebugString(TEXT("调试信息:MyCircleImpl::~MyCircl ...

  5. arping 通知网关刷新IP

     arping -c 2 -I em1 -s 192.168.110.12  192.168.110.1  

  6. PDB重命名

    PDB重命名 将PDB clonedb重命名为rdb SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE --------------- ...

  7. Feature Scaling

    定义:Feature scaling is a method used to standardize the range of independent variables or features of ...

  8. php第三方登陆

    学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博文分享!

  9. git批量删除分支

    要删除本地,首先要考虑以下三点 列出所有本地分支 搜索目标分支如:所有含有'dev'的分支 将搜索出的结果传给删除函数 所以我们可以得到: git br |grep 'dev' |xargs git ...

  10. 夺命雷公狗---node下的一聊天室-首发

    今晚感觉挺蛋疼,就用了点时间,在node下开发了个聊天室来玩玩,不过之是简单的开发了套而已,并没多做什么考虑,, 但是发现了一个好处就是用node来写聊天室代码居然少得可怜,这个不佩服node都不行, ...