Android开发之二维码ZXing vs ZBar

时间:2021-09-18 07:08:45

很多手机app条形码应用都使用了ZXing和ZBar两个开源条形码SDK。那么从检测速度和检测率看哪个更出色呢?ZXing用Java实现,ZBar用C/C++实现,为了确保公平,这里用JNI封装ZBar,用Java写测试。

参考原文:How to Benchmark Barcode SDK Performance – ZXing vs ZBar

作者:Desmond Shaw

翻译:yushulx

SDK下载

ZXing Source code

https://github.com/zxing/zxing

ZBar Source Code

https://github.com/ZBar/ZBar

ZBar Windows Installer

http://sourceforge.net/projects/zbar/files/zbar/

如何使用Java解码TIFF文件

通过Java SDK中的ImageIO,我们可以解码很多图片格式,比如JPEG,PNG,BMP。但是TIFF是不支持的。实际使用的时候,经常会用到TIFF文件读取条形码。Oracle官方提供了Java Advanced Imaging (JAI)来支持TIFF。

JAI下载

照理说Oracle的官网是应该提供JAI的下载链接的。但是很奇怪的是打开之后都是404错误。在网上搜了一圈,找到了一个可用链接:http://www.java2s.com/Code/Jar/j/Downloadjaicore113jar.htm。使用的时候需要下载jai_codec-1.1.3.jarjai_core-1.1.3.jar。这里是一个把TIFF读到int[]的例子:

File file = new File(fileName); RenderedImage tiff = JAI.create("tiffload", fileName); BufferedImage image = PlanarImage.wrapRenderedImage(tiff).getAsBufferedImage(); int[] pixels = image.getRGB(00, image.getWidth(), image.getHeight(), null0, image.getWidth();

使用ZXing读取图片中的多个条形码

ZXing中的MultiFormatReader是用来读取一个条形码的,要读取多个条形码,需要把它放到GenericMultipleBarcodeReader中:

RGBLuminanceSource source = new RGBLuminanceSource(image.getWidth(),         image.getHeight(), pixels); bitmap = new BinaryBitmap(new HybridBinarizer(source));   Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>(); hints.put(DecodeHintType.TRY_HARDER, null); Collection<BarcodeFormat> formats = new ArrayList<>(); formats.add(BarcodeFormat.QR_CODE); formats.add(BarcodeFormat.CODABAR); formats.add(BarcodeFormat.CODE_39); formats.add(BarcodeFormat.CODE_93); formats.add(BarcodeFormat.CODE_128); formats.add(BarcodeFormat.EAN_8); formats.add(BarcodeFormat.EAN_13); formats.add(BarcodeFormat.ITF); formats.add(BarcodeFormat.UPC_A); formats.add(BarcodeFormat.UPC_E); formats.add(BarcodeFormat.UPC_EAN_EXTENSION);   hints.put(DecodeHintType.POSSIBLE_FORMATS, formats); MultiFormatReader reader = new MultiFormatReader();    // read multi barcodes GenericMultipleBarcodeReader multiReader = new GenericMultipleBarcodeReader(         reader); try {     Result[] results = multiReader.decodeMultiple(bitmap, hints);     System.out.println(ZXING + TIME_COST             + ((System.nanoTime() - start) / 1000000) + MS);     if (results != null) {         for (Result result : results) {             System.out.println(ZXING + TYPE + result.getBarcodeFormat() + VALUE + result.getText());         }     } } catch (NotFoundException e) {     e.printStackTrace();     return; }

ZBar JNI

要用JNI封装ZBar,最简单的方法就是参考自带的例子scan_image.cpp。把main函数改成JNI的接口就行了,在底层获取数据之后返回给Java层:

 
  

这里你会需要用到ImageMagick x86版本,下载地址:http://www.imagemagick.org/script/binary-releases.php

相关的Java类如下:

ZBarReader.java

package com.dynamsoft.zbar;   import com.dynamsoft.utils.BaseReader;   public class ZBarReader extends BaseReader {       static {         System.loadLibrary("zbarjni");     }       public void testZBar(String fileName) {         long start = System.nanoTime();         ZBarReader reader =  new ZBarReader();         ZBarResult[] results = (ZBarResult[])reader.decode(fileName);         System.out.println(ZBAR + TIME_COST                 + ((System.nanoTime() - start) / 1000000) + MS);           if (results != null && results.length > 0) {             mCount += 1;             for (ZBarResult result : results) {                 System.out.println(ZBAR + TYPE + result.mType + VALUE + result.mValue);             }         }     }       @Override     public int getCount() {         // TODO Auto-generated method stub         return super.getCount();     }       public native Object[] decode(String fileName); }

ZBarResult.java

package com.dynamsoft.zbar;   public class ZBarResult {     public String mType;     public String mValue; }

性能PK

找一些数据集来测试。多条形码测试可以使用Dynamsoft的测试数据https://github.com/Dynamsoft/Dynamsoft-Barcode-Reader/tree/master/Images,单条形码可以使用ZXing的数据https://github.com/zxing/zxing/tree/master/core/src/test/resources。这里用ZXing的二维码数据https://github.com/zxing/zxing/tree/master/core/src/test/resources/blackbox/qrcode-1来做一个测试对比,结果如下:

F:\resources\blackbox\qrcode-1\1.png   ZXI Time cost122ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost33ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\10.png   ZXI Time cost66ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost28ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\11.png   ZXI Time cost53ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost29ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\12.png   ZXI Time cost71ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost29ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\13.png   ZXI Time cost84ms   ZXI Type: QR_CODE, valuehttp://google.com/gwt/n?u=bluenile.com   ZBA Time cost27ms   ZBA Type: QR-Code, valuehttp://google.com/gwt/n?u=bluenile.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\14.png   com.google.zxing.NotFoundException   ZBA Time cost32ms   ZBA Type: QR-Code, valuehttp://google.com/gwt/n?u=bluenile.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\15.png   ZXI Time cost90ms   ZXI Type: QR_CODE, valuehttp://google.com/gwt/n?u=bluenile.com   ZBA Time cost34ms   ZBA Type: QR-Code, valuehttp://google.com/gwt/n?u=bluenile.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\16.png   ZXI Time cost77ms   ZXI Type: QR_CODE, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   ZBA Time cost35ms   ZBA Type: QR-Code, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\17.png   ZXI Time cost82ms   ZXI Type: QR_CODE, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   ZBA Time cost32ms   ZBA Type: QR-Code, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\18.png   ZXI Time cost80ms   ZXI Type: QR_CODE, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   ZBA Time cost35ms   ZBA Type: QR-Code, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\19.png   ZXI Time cost64ms   ZXI Type: QR_CODE, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   ZBA Time cost28ms   ZBA Type: QR-Code, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\2.png   ZXI Time cost61ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost28ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\20.png   ZXI Time cost55ms   ZXI Type: QR_CODE, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   ZBA Time cost30ms   ZBA Type: QR-Code, value: Sean Owen   srowen@google.com   917-364-2918   http://awesome-thoughts.com   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\3.png   ZXI Time cost56ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost29ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\4.png   ZXI Time cost70ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost28ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\5.png   ZXI Time cost64ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost28ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\6.png   ZXI Time cost56ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost28ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\7.png   ZXI Time cost73ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost30ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\8.png   ZXI Time cost55ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost27ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------          F:\resources\blackbox\qrcode-1\9.png   ZXI Time cost55ms   ZXI Type: QR_CODE, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   ZBA Time cost27ms   ZBA Type: QR-Code, valueMEBKM:URL:http\://en.wikipedia.org/wiki/Main_Page;;   -------------------------------------------------------------------------------------   ZXI passed19   ZBA passed20

结果发现,ZBar的二维码解码速度居然比ZXing快很多!感兴趣的同学可以去测试下别的数据。

源码

https://github.com/Dynamsoft/Dynamsoft-Barcode-Reader/tree/master/samples/Java