ZXing是一个开源Java类库用于解析多种格式的条形码和二维码

2014年05月07日 17:30:37 shine4j 阅读数 5677

blog迁移至:http://www.micmiu.com

继前面介绍的一个日本开源软件(该软件只能实现QRCode)原文: Java实现二维码QRCode的编码和解码 (http://sjsky.iteye.com/blog/1136934),今发现又一优秀的开源利器-- ZXing,相比而言它更加灵活方便,可以实现多种编码格式。

全文目录:

  • 基本介绍
  • 二维码(比如:QRCode)的编码和解码演示
  • 条形码(比如:EAN-13)的编码和解码演示

【一】、基本介绍:

1-1. ZXing是一个开源Java类库用于解析多种格式的条形码和二维码.

官网:http://code.google.com/p/zxing/

截止目前为止最新版本为1.7,提供以下编码格式的支持:

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 93
  • Code 128
  • QR Code
  • ITF
  • Codabar
  • RSS-14 (all variants)
  • Data Matrix
  • PDF 417 ('alpha' quality)
  • Aztec ('alpha' quality)

同时官网提供了 Android、cpp、C#、iPhone、j2me、j2se、jruby、objc、rim、symbian等多种应用的类库,具体详情可以参考下载的源码包中。

1-2. 本文和之前的那篇文章一样,主要是在PC上实现条形码(EAN-13)和二维码(QRCode)的编码和解码的示例,以供大家参考,用到了源码中core和javase下面的相关源代码,附件提供自己编译之后的lib包:

  • zxing.jar
  • zxing-j2se.jar

有关各种手机系统的应用,有兴趣的朋友可以下载官方源码包,包下有具体详细的应用介绍。

【二】、二维码(QRCode)的编码和解码演示:

2-1. 编码示例:

Java代码  

  1. package michael.zxing;
  2. import java.io.File;
  3. import java.util.Hashtable;
  4. import com.google.zxing.BarcodeFormat;
  5. import com.google.zxing.EncodeHintType;
  6. import com.google.zxing.MultiFormatWriter;
  7. import com.google.zxing.client.j2se.MatrixToImageWriter;
  8. import com.google.zxing.common.BitMatrix;
  9. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  10. /**
  11. * @blog http://sjsky.iteye.com
  12. * @author Michael
  13. */
  14. public class ZxingEncoderHandler {
  15. /**
  16. * 编码
  17. * @param contents
  18. * @param width
  19. * @param height
  20. * @param imgPath
  21. */
  22. public void encode(String contents, int width, int height, String imgPath) {
  23. Hashtable<Object, Object> hints = new Hashtable<Object, Object>();
  24. // 指定纠错等级
  25. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
  26. // 指定编码格式
  27. hints.put(EncodeHintType.CHARACTER_SET, "GBK");
  28. try {
  29. BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
  30. BarcodeFormat.QR_CODE, width, height, hints);
  31. MatrixToImageWriter
  32. .writeToFile(bitMatrix, "png", new File(imgPath));
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. /**
  38. * @param args
  39. */
  40. public static void main(String[] args) {
  41. String imgPath = "d:/test/twocode/michael_zxing.png";
  42. String contents = "Hello Michael(大大),welcome to Zxing!"
  43. + "\nMichael’s blog [ http://sjsky.iteye.com ]"
  44. + "\nEMail [ sjsky007@gmail.com ]" + "\nTwitter [ @suncto ]";
  45. int width = 300, height = 300;
  46. ZxingEncoderHandler handler = new ZxingEncoderHandler();
  47. handler.encode(contents, width, height, imgPath);
  48. System.out.println("Michael ,you have finished zxing encode.");
  49. }
  50. }

运行后生成的二维码图片如下:


 和前篇介绍一样,用手机的二维码扫描软件(本人用的:android 快拍二维码)来测试下,识别成功的截图如下:

2-2. 解码示例:

Java代码  

  1. package michael.zxing;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.util.Hashtable;
  5. import javax.imageio.ImageIO;
  6. import com.google.zxing.BinaryBitmap;
  7. import com.google.zxing.DecodeHintType;
  8. import com.google.zxing.LuminanceSource;
  9. import com.google.zxing.MultiFormatReader;
  10. import com.google.zxing.Result;
  11. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
  12. import com.google.zxing.common.HybridBinarizer;
  13. /**
  14. * @blog http://sjsky.iteye.com
  15. * @author Michael
  16. */
  17. public class ZxingDecoderHandler {
  18. /**
  19. * @param imgPath
  20. * @return String
  21. */
  22. public String decode(String imgPath) {
  23. BufferedImage image = null;
  24. Result result = null;
  25. try {
  26. image = ImageIO.read(new File(imgPath));
  27. if (image == null) {
  28. System.out.println("the decode image may be not exit.");
  29. }
  30. LuminanceSource source = new BufferedImageLuminanceSource(image);
  31. BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  32. Hashtable<Object, Object> hints = new Hashtable<Object, Object>();
  33. hints.put(DecodeHintType.CHARACTER_SET, "GBK");
  34. result = new MultiFormatReader().decode(bitmap, hints);
  35. return result.getText();
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return null;
  40. }
  41. /**
  42. * @param args
  43. */
  44. public static void main(String[] args) {
  45. String imgPath = "d:/test/twocode/michael_zxing.png";
  46. ZxingDecoderHandler handler = new ZxingDecoderHandler();
  47. String decodeContent = handler.decode(imgPath);
  48. System.out.println("解码内容如下:");
  49. System.out.println(decodeContent);
  50. System.out.println("Michael ,you have finished zxing decode.");
  51. }
  52. }

运行结果如下:

解码内容如下:
Hello Michael(大大),welcome to Zxing!
Michael’s blog [ http://sjsky.iteye.com ]
EMail [ sjsky007@gmail.com ]
Twitter [ @suncto ]
Michael ,you have finished zxing decode.

从测试结果可见:解码出的内容和之前编码的内容是一致

【三】、条形码(EAN-13)的编码和解码演示:

3-1. 编码示例:

Java代码  

  1. package michael.zxing;
  2. import java.io.File;
  3. import com.google.zxing.BarcodeFormat;
  4. import com.google.zxing.MultiFormatWriter;
  5. import com.google.zxing.client.j2se.MatrixToImageWriter;
  6. import com.google.zxing.common.BitMatrix;
  7. /**
  8. * @blog http://sjsky.iteye.com
  9. * @author Michael
  10. */
  11. public class ZxingEAN13EncoderHandler {
  12. /**
  13. * 编码
  14. * @param contents
  15. * @param width
  16. * @param height
  17. * @param imgPath
  18. */
  19. public void encode(String contents, int width, int height, String imgPath) {
  20. int codeWidth = 3 + // start guard
  21. (7 * 6) + // left bars
  22. 5 + // middle guard
  23. (7 * 6) + // right bars
  24. 3; // end guard
  25. codeWidth = Math.max(codeWidth, width);
  26. try {
  27. BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
  28. BarcodeFormat.EAN_13, codeWidth, height, null);
  29. MatrixToImageWriter
  30. .writeToFile(bitMatrix, "png", new File(imgPath));
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. /**
  36. * @param args
  37. */
  38. public static void main(String[] args) {
  39. String imgPath = "d:/test/twocode/zxing_EAN13.png";
  40. // 益达无糖口香糖的条形码
  41. String contents = "6923450657713";
  42. int width = 105, height = 50;
  43. ZxingEAN13EncoderHandler handler = new ZxingEAN13EncoderHandler();
  44. handler.encode(contents, width, height, imgPath);
  45. System.out.println("Michael ,you have finished zxing EAN13 encode.");
  46. }
  47. }

6 923450 657713 对应的是益达无糖口香糖:

运行后生成的条形码图片如下:

用手机的扫描软件,识别成功的截图如下:

3-2. 解码示例:

Java代码  

  1. package michael.zxing;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import javax.imageio.ImageIO;
  5. import com.google.zxing.BinaryBitmap;
  6. import com.google.zxing.LuminanceSource;
  7. import com.google.zxing.MultiFormatReader;
  8. import com.google.zxing.Result;
  9. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
  10. import com.google.zxing.common.HybridBinarizer;
  11. /**
  12. * @blog http://sjsky.iteye.com
  13. * @author Michael
  14. */
  15. public class ZxingEAN13DecoderHandler {
  16. /**
  17. * @param imgPath
  18. * @return String
  19. */
  20. public String decode(String imgPath) {
  21. BufferedImage image = null;
  22. Result result = null;
  23. try {
  24. image = ImageIO.read(new File(imgPath));
  25. if (image == null) {
  26. System.out.println("the decode image may be not exit.");
  27. }
  28. LuminanceSource source = new BufferedImageLuminanceSource(image);
  29. BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
  30. result = new MultiFormatReader().decode(bitmap, null);
  31. return result.getText();
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. return null;
  36. }
  37. /**
  38. * @param args
  39. */
  40. public static void main(String[] args) {
  41. String imgPath = "d:/test/twocode/zxing_EAN13.png";
  42. ZxingEAN13DecoderHandler handler = new ZxingEAN13DecoderHandler();
  43. String decodeContent = handler.decode(imgPath);
  44. System.out.println("解码内容如下:");
  45. System.out.println(decodeContent);
  46. System.out.println("Michael ,you have finished zxing EAN-13 decode.");
  47. }
  48. }

运行结果如下:

写道

解码内容如下:
6923450657713
Michael ,you have finished zxing decode.

从测试结果可见:解码出的内容和之前编码的内容是一致。

转载请注明来自:Michael's blog @ http://sjsky.iteye.com

ZXing是一个开源Java类库用于解析多种格式的条形码和二维码相关推荐

  1. ZXing实现条形码、二维码

    一. 基本介绍 1-1. ZXing是一个开源Java类库用于解析多种格式的条形码和二维码.官网:http://code.google.com/p/zxing/ 截止目前为止最新版本为1.7,提供以下 ...

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

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

  3. java条形码和二维码解析

    java条形码和二维码解析 条形码(一维码) 条形码(barcode) – 将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符 – 通常代表一串数字/字母,每一位有特殊含 ...

  4. JAVA使用barcode4j生成条形码和二维码图片以及带logo的二维码,验证码图片

    二维码 1.Maven引入barcode4j依赖 <!-- 条形码生成 --><dependency><groupId>net.sf.barcode4j</g ...

  5. asp.net 生成、解析条形码和二维码

    asp.net 生成.解析条形码和二维码 原文 asp.net 生成.解析条形码和二维码 一.条形码 一维码,俗称条形码,广泛的用于电子工业等行业.比如我们常见的书籍背面就会有条形码,通过扫描枪等设备 ...

  6. java——记录一次条形码、二维码、订单自动生成的制作

    目录 条形码的生成 解决方案 生成结果如下 工具包下载 代码如下 二维码码的生成 解决方案 生成结果如下 工具包下载 代码如下 订单自动生成的制作 效果如下 源代码下载 条形码的生成 解决方案 使用j ...

  7. java生成、识别条形码和二维码

    一.概述 使用 zxing 开源库 Zxing主要是Google出品的,用于识别一维码和二维码的第三方库 主要类: BitMatrix 位图矩阵 MultiFormatWriter 位图编写器 Mat ...

  8. 碎步二:zxing核心包生成条形码和二维码

    最近闲得无趣,于是写点技术知识放到博客上,希望以后对自己有所帮助.随着时代的发展,二维码已经悄悄的被时代所认可,不管是个人或者公司,二维码受到很多人的认可,如今在互联网上二维码几乎随处可见.废话不多说 ...

  9. C#利用ZXing.Net生成条形码,二维码和带Logo的二维码

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

最新文章

  1. 超牛EXCEL操作技巧,用的好,会涨工资哦
  2. 数据结构实验之二叉树五:层序遍历(STL和模拟队列两种方法)
  3. JavaScript强化教程——正则表达式回溯
  4. ZZULIOJ 1066:字符分类统计
  5. 【HTML5】在canvas上绘制简单的2D图形 (+太极图)
  6. Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK
  7. ubuntu下安装tftp
  8. 学习笔记(4):思科CCNA模拟器Packet Tracer使用入门-路由器的使用(2811、2911)
  9. FMEA软件版本及差异管理(FMEAHunter)
  10. [天地间]02-瑞士达沃斯小镇
  11. 如果这篇文章说不清epoll的本质,那就过来掐死我吧!
  12. 论文学习笔记-M2Det
  13. 使用PHP求解二元一次方程,二元一次方程求解
  14. Latex制作beamer幻灯片、写论文的基本语句
  15. 国家开放大学2021春1130卫生法学题目
  16. Android Studio 线性布局Linearlayout的控件位置控制l属性Layout_margin失效问题解决
  17. css动画与渐变案例,使用动画和渐变做一个背景动态网页
  18. Cytoscape.js学习记录
  19. 程序员一定要会的软件项目管理评估方案,不做只会敲代码的码农!(建议收藏)
  20. pascal java_GitHub - DronPascal/Java-Basics

热门文章

  1. 技术类图书聚合的小众网站推荐
  2. 熔断器熔断时间标准_熔断器为什么一般不宜作过载保护,主要用作短路保护?结合时间-电流特性说明原因?...
  3. ExitProcess与TerminateProcess函数
  4. android上传图片并附带上传数据,文件流
  5. Android 下载apk包并安装
  6. 时间同步设置NTP和Chrony两种方式—— 筑梦之路
  7. Apache Hudi 0.7.0 和 0.8.0 新功能已在 Amazon EMR 中可用
  8. java Statement类
  9. word2007的大纲级别自动修改为1的解决办法
  10. 微信服务号通过Excel操作数据库发送消息的开发流程