ZXing将Bitmap转换为BinaryBitmap

时间:2013-02-13 19:34:26

标签: android zxing

我正在使用OpenCV和Zxing,我想添加2d代码扫描。我有几种类型的图像可以发送。可能最好的是Bitmat(另一种选择是OpenCV Mat)。

看起来你曾经能够像这样转换:

Bitmap frame = //this is the frame coming in

LuminanceSource source = new RGBLuminanceSource(frame);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

//then I can use reader.decode(bitmap) to decode the BinaryBitmap

然而,RGBLuminaceSource看起来不再需要位图作为输入。那么我怎样才能将输入图像转换为BinaryBitmap ???

编辑:

好的,我相信我已经取得了一些进展,但我仍然遇到了问题。我想我有将代码转换为正确格式的代码,但我现在得到的是arrayIndexOutOfBounds

public void zxing(){
    Bitmap bMap = Bitmap.createBitmap(frame.width(), frame.height(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(frame, bMap);
    byte[] array = BitmapToArray(bMap);
    LuminanceSource source = new PlanarYUVLuminanceSource(array, bMap.getWidth(), bMap.getHeight(), 0, 0, bMap.getWidth(), bMap.getHeight(), false);

    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    Reader reader = new DataMatrixReader();
    String sResult = "";
    try {
        Result result = reader.decode(bitmap);
        sResult = result.getText();
        Log.i("Result", sResult);
        }
    catch (NotFoundException e) {
            Log.d(TAG, "Code Not Found");
            e.printStackTrace();
    }
}

public byte[] BitmapToArray(Bitmap bmp){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, 50, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
}

我收到错误

02-14 10:19:27.469: E/AndroidRuntime(29736): java.lang.ArrayIndexOutOfBoundsException: length=33341; index=34560 02-14 10:19:27.469: E/AndroidRuntime(29736):   at 
com.google.zxing.common.HybridBinarizer.calculateBlackPoints(HybridBinarizer.java:199)

我记录了byte []的大小,它是上面显示的长度。我无法弄清楚为什么zxing期望它更大

3 个答案:

答案 0 :(得分:10)

好的我明白了。正如Sean Owen所说,PlanarYUVLuminaceSource只适用于默认的Android摄像头格式,我猜OpenCV不会使用。简而言之,这就是你要做的事情:

//(note, mTwod is the CV Mat that contains my datamatrix code)

Bitmap bMap = Bitmap.createBitmap(mTwod.width(), mTwod.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mTwod, bMap);
int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];  
//copy pixel data from the Bitmap into the 'intArray' array  
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());  

LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(),intArray);

BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Reader reader = new DataMatrixReader();     
//....doing the actually reading
Result result = reader.decode(bitmap);

就是这样,一点也不难。只需将Android Bitmap转换为整数数组,它就是一块蛋糕。

答案 1 :(得分:9)

public static String readQRImage(Bitmap bMap) {
    String contents = null;

    int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];  
    //copy pixel data from the Bitmap into the 'intArray' array  
    bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());  

    LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(), intArray);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

    Reader reader = new MultiFormatReader();// use this otherwise ChecksumException
    try {
        Result result = reader.decode(bitmap);
        contents = result.getText(); 
        //byte[] rawBytes = result.getRawBytes(); 
        //BarcodeFormat format = result.getBarcodeFormat(); 
        //ResultPoint[] points = result.getResultPoints();
    } catch (NotFoundException e) { e.printStackTrace(); } 
    catch (ChecksumException e) { e.printStackTrace(); }
    catch (FormatException e) { e.printStackTrace(); } 
    return contents;
}

答案 2 :(得分:2)

Bitmap是一个Android类。来自相机的Android默认图像格式是平面YUV格式。这就是为什么Android只需要PlanarYUVLuminanceSource并且存在的原因。 <{1}}必须移植。

你把完全错误的数据放入课堂。它期待YUV平面格式的像素。您正在传递JPEG文件的压缩字节。