使用ZXing库在Android上使用QRCode解码位图

时间:2016-07-02 08:05:48

标签: java android zxing

最近我使用zxing解码位图有困难。我在互联网上搜索解决方案,我尝试了其中的一些。这是我的尝试:

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.qrcode);
    String result = DecodeUtils.decodeWithZxing(bitmap);

R.drawable.qrcode.jpg个文件。

BarCodeUtil.java是:

 public static String decodeWithZxing(Bitmap bitmap) {
    MultiFormatReader multiFormatReader = new MultiFormatReader();
    Map<DecodeHintType, Object> hints = new Hashtable<>();
    hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
    multiFormatReader.setHints(hints);

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    Result rawResult = null;
    RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);

    if (source != null) {
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
        try {
            rawResult = multiFormatReader.decodeWithState(binaryBitmap);
        } catch (ReaderException re) {
            re.printStackTrace();
        } finally {
            multiFormatReader.reset();
        }
    }
    return rawResult != null ? rawResult.getText() : null;
}

但是当我运行上面的代码时,我得到了一个例外:

  

com.google.zxing.NotFoundException

所以我搜索异常,有人认为位图大小会导致此异常。然后我调整位图大小:

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = 4; 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.zhifubao,options);
    String result = DecodeUtils.decodeWithZxing(bitmap)

但它仍然不适合我。

使用qrcode解码位图有一个很好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

你的开发工具是eclipse还是android studio?

如果是android stuido:

在您的项目中&gt; app&gt;建立。 gradel on add:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])

}

然后同步gradle。

答案 1 :(得分:0)

我知道这可能已经很晚了,但是,这仅意味着在图像中未找到条形码。参见here

NotFoundException
在图像中未找到条形码时抛出。

如果其他任何人最终遇到相同的问题,即无法解码QRcode或upc之类的条形码,则可能是使用了错误的位图颜色空间。当摄像机中的数据实际上在YUV中时,您可能正在尝试使用RGB。

您应该像示例here一样使用PlanarYUVLuminanceSource,而不是RGBLuminanceSource