文档章节

ZXing读写二维码,桌面和手机的不同用法

yushulx
 yushulx
发布于 2015/08/18 14:34
字数 973
阅读 773
收藏 2

虽然ZXing是用Java实现的Barcode开源库,但是并不代表桌面上实现的Barcode应用在手机上也可以直接使用。因为Android的Java接口有很多是不同的。这里分享下Java Barcode生成和读取的不同用法。

参考原文:How to Write and Read QR Code with ZXing in Java

作者:Desmond Shaw

翻译:yushulx

获取ZXing源码

之前ZXing是放在Google Code上的,现在已经全部移到了GitHub上。命令行获取:

git clone https://github.com/zxing/zxing

在工程中添加ZXing

工程中导入ZXing有两方方法:

  1. 把ZXing编译成jar包,导入到工程中使用。比如在Android Studio中可以新建一个module,把ZXing源码导入之后就可以build出一个jar包。

  2. 直接使用ZXing源码。在工程属性中选择Project Properties > Java Build Path > Source > Link Source。确定输入正确的folder名称,不然会出现大量的package错误。

ZXing源码解析

要生成二维码,需要用到Writer类。搜索implements Writer可以看到所有ZXing支持的Barcode Writer。

这里包含了所有的1D/2D条形码。ZXing支持的条形码类型可以查询BarcodeFormat.java

public enum BarcodeFormat {
 
  /** Aztec 2D barcode format. */
  AZTEC,
 
  /** CODABAR 1D format. */
  CODABAR,
 
  /** Code 39 1D format. */
  CODE_39,
 
  /** Code 93 1D format. */
  CODE_93,
 
  /** Code 128 1D format. */
  CODE_128,
 
  /** Data Matrix 2D barcode format. */
  DATA_MATRIX,
 
  /** EAN-8 1D format. */
  EAN_8,
 
  /** EAN-13 1D format. */
  EAN_13,
 
  /** ITF (Interleaved Two of Five) 1D format. */
  ITF,
 
  /** MaxiCode 2D barcode format. */
  MAXICODE,
 
  /** PDF417 format. */
  PDF_417,
 
  /** QR Code 2D barcode format. */
  QR_CODE,
 
  /** RSS 14 */
  RSS_14,
 
  /** RSS EXPANDED */
  RSS_EXPANDED,
 
  /** UPC-A 1D format. */
  UPC_A,
 
  /** UPC-E 1D format. */
  UPC_E,
 
  /** UPC/EAN extension format. Not a stand-alone format. */
  UPC_EAN_EXTENSION
 
}

MultiFormatWriter 这个类包涵了各种条形码生成器:

@Override
  public BitMatrix encode(String contents,
                          BarcodeFormat format,
                          int width, int height,
                          Map<EncodeHintType,?> hints) throws WriterException {
 
    Writer writer;
    switch (format) {
      case EAN_8:
        writer = new EAN8Writer();
        break;
      case EAN_13:
        writer = new EAN13Writer();
        break;
      case UPC_A:
        writer = new UPCAWriter();
        break;
      case QR_CODE:
        writer = new QRCodeWriter();
        break;
      case CODE_39:
        writer = new Code39Writer();
        break;
      case CODE_128:
        writer = new Code128Writer();
        break;
      case ITF:
        writer = new ITFWriter();
        break;
      case PDF_417:
        writer = new PDF417Writer();
        break;
      case CODABAR:
        writer = new CodaBarWriter();
        break;
      case DATA_MATRIX:
        writer = new DataMatrixWriter();
        break;
      case AZTEC:
        writer = new AztecWriter();
        break;
      default:
        throw new IllegalArgumentException("No encoder available for format " + format);
    }
    return writer.encode(contents, format, width, height, hints);
  }

同样的,可以搜索implements Reader看到对应的类:

使用MultiFormatReader可以简化代码。

Windows, Mac和Linux上二维码的生成和读取

使用Java创建桌面Barcode应用,需要用到BufferedImage来操作图像。

Java QRCode Writer

public static void writeQRCode() {
    QRCodeWriter writer = new QRCodeWriter();
    int width = 256, height = 256;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // create an empty image
    int white = 255 << 16 | 255 << 8 | 255;
    int black = 0;
    try {
        BitMatrix bitMatrix = writer.encode("http://www.codepool.biz/zxing-write-read-qrcode.html", BarcodeFormat.QR_CODE, width, height);
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                image.setRGB(i, j, bitMatrix.get(i, j) ? black : white); // set pixel one by one
            }
        }
 
        try {
            ImageIO.write(image, "jpg", new File("dynamsoftbarcode.jpg")); // save QR image to disk
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    } catch (WriterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Java QRCode Reader

在读取图像数据的时候,需要使用RGBLuminanceSource来封装数据RGB。

 public static String readQRCode(String fileName) {
    File file = new File(fileName);
    BufferedImage image = null;
    BinaryBitmap bitmap = null;
    Result result = null;
 
    try {
        image = ImageIO.read(file);
        int[] pixels = image.getRGB(0, 0, image.getWidth(), image.getHeight(), null, 0, image.getWidth());
        RGBLuminanceSource source = new RGBLuminanceSource(image.getWidth(), image.getHeight(), pixels);
        bitmap = new BinaryBitmap(new HybridBinarizer(source));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    if (bitmap == null)
        return null;
 
    QRCodeReader reader = new QRCodeReader();   
    try {
        result = reader.decode(bitmap);
        return result.getText();
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ChecksumException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    return null;
}

Android上二维码的生成和读取

在Android平台上,BufferedImage是不存在的。取而代之的是Bitmap。

Android QRCode Writer

QRCodeWriter writer = new QRCodeWriter();
try {
    int width = mImageView.getWidth();
    int height = mImageView.getHeight();
    BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height);
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            bitmap.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK: Color.WHITE);
        }
    }
    mImageView.setImageBitmap(bitmap);
} catch (WriterException e) {
    e.printStackTrace();
}

Android QRCode Reader

从camera预览进来的数据是NV21格式的,所以在封装数据的时候需要使用PlanarYUVLuminanceSource 

MultiFormatReader reader = new MultiFormatReader();            
LuminanceSource source = new PlanarYUVLuminanceSource(yuvData, dataWidth, dataHeight, left, top, width, height, false);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Result result;
try {
    result = reader.decode(bitmap);
    if (result != null) {
        mDialog.setTitle("Result");
        mDialog.setMessage(result.getText());
        mDialog.show();
    }
} catch (NotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}


© 著作权归作者所有

yushulx
粉丝 29
博文 111
码字总数 62988
作品 0
杭州
私信 提问
Java 二维码开发包 zxing 使用教程

有一个开源的 Java 类库叫做 “zxing” (Zebra Crossing),可以用来读写不同类型的条形码,包括二维码。 我测试了 zxing,它可以读取一个嵌在 100 dpi 的灰度文档中的条形码! 这篇文章讲述...

虫虫
2012/03/30
25.3K
6
利用zxing读写PDF417码制的二维码

项目中需要用到二维码,二维码的码制是PDF417,在做了一番研究之后发现zxing是个不错的开源工具(代码托管在google上面)。为什么选择zxing,由于其他一些工具比如barcode4j(开源,支持读,...

彭苏云
2013/12/17
3.5K
1
手机二维码~~~ZXing简介

最近3G不断在发力,商务部也主动牵头推动移动电子商务的发展,所以,针对企业应用、消费辅助类的J2ME软件将以更快的速度涌现。这里,我要介绍的是,手机的新应用----手机二维码。 什么是一维...

晨曦之光
2012/03/14
3.1K
0
Android微信扫描二维码登入实现 基于ZXing开源工程

项目需求,做一个类似微信扫描二维码,网页端登陆的功能实现。 利用开源项目ZXing来实现。ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1...

jeffzhao
2013/02/02
14.3K
7
Android平台利用ZXING生成二维码图片

zxing是google的一个开源二维码项目,目前基本上和二维码打交道的东西,都会用到它. 最近项目中用到了android手机需要根据提供的字符串生成二维码图片,之前用zxing做过二维码解码,编码还没做过...

xiahuawuyu
2012/04/25
3.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

5 分钟快速学习,缓存一致性优化方案!

缓存操作 读缓存 读缓存可以分为两种情况命中(cache hit)和未命中(cache miss): 缓存命中 首先从缓存中获取数据 将缓存中的数据返回 缓存未命中 首先从缓存中获取数据 此时缓存未命中,...

架构文摘
6分钟前
1
0
【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式锁-升级版

设计 我们依然实现java.util.concurrent.locks.Lock接口。 和上一文中实现方式不同的是,我们使用ZooKeeper的EPHEMERAL_SEQUENTIAL临时顺序节点。 当首次获取锁时,会创建一个临时节点,如果...

阿里云官方博客
7分钟前
1
0
inner join 和 union all 做的汇总区别

inner join CREATE OR REPLACE VIEW M_INVENT_BARCODE_DIFF ASSELECT "INV_PART_NO","INV_ONHAND","INV_LOCATION","PART_NO","BAR_ONHAND","BAR_LOCATION"FROM (SELECT m.part_no AS......

donald121
14分钟前
3
0
EMC 设计经验总结

整体布局 1、高速、中速、低速电路要分开; 2、强电流、高电压、强辐射元器件远离弱电流、低电压、敏感元器件; 3、模拟、数字、电源、保护电路要分开; 4 、多层板设计,有单独的电源和地平...

demyar
17分钟前
2
0
支付宝高级Java现场面试35题:页锁+死锁+集群+雪崩+负载等

年底是冲刺大厂的良机,这个时间点大部分人都在观望年终奖与加薪幅度,看情况再伺机而动,人才市场的竞争反而没那么激烈。 获悉到支付宝近期有HC放出,我通过内推渠道,得到了支付宝的面试机...

mikechen优知
19分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部