zxing lib在纵向模式下不能平滑地检测qrcode

时间:2013-07-12 05:56:26

标签: android zxing

我已成功将ZXing lib修改为纵向模式following this post,同时将预览矩形修改为方形,如下面的img。但我发现实际扫描矩形只是预测矩形的一半大小,只有当我将qrcode对齐到预览矩形的上半部分时才会得到快速平滑的结果,就像ZXing演示应用程序一样。

我检查 getFramingRect()&在 CameraManager 中的 getFramingRectInPreview()方法修改预览rect,从ViewFinderView.onDraw()我可以打印出那些2个rect。但我仍然不知道哪个矩形实际用于检测。是frame还是previewFrame?或者是其他东西?如何将预览方形矩形与检测矩形对齐

@Override
public void onDraw(Canvas canvas) {
    if (cameraManager == null) {
        return; // not ready yet, early draw before done configuring
    }
    Rect frame = cameraManager.getFramingRect();
    Rect previewFrame = cameraManager.getFramingRectInPreview();
    if (frame == null || previewFrame == null) {
        return;
    }
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    Log.d(TAG, "@ FramingRect : " + frame.left + "/" + frame.top + "/" + frame.right + "/" + frame.bottom);
    Log.d(TAG, "@ Preview FramingRect : " +
            previewFrame.left + "/" + previewFrame.top + "/" + previewFrame.right + "/" + previewFrame.bottom);

enter image description here

每当我调整getFramingRectInPreview()中的previewRect时,都会发生此异常:

java.lang.IllegalArgumentException: Crop rectangle does not fit within image data.
    at com.google.zxing.PlanarYUVLuminanceSource.<init>(PlanarYUVLuminanceSource.java:50)
    at com.google.zxing.client.android.camera.CameraManager.buildLuminanceSource(CameraManager.java:339)
    at com.google.zxing.client.android.DecodeHandler.decode(DecodeHandler.java:87)
    at com.google.zxing.client.android.DecodeHandler.handleMessage(DecodeHandler.java:55)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at com.google.zxing.client.android.DecodeThread.run(DecodeThread.java:104)

尝试&amp;错误后,我只能将previewRect向下移动100,向右移动60.这似乎使检测过程更加顺畅。

1 个答案:

答案 0 :(得分:1)

getFramingRect()相对于屏幕,getFramingRectInPreview()相对于来自相机的预览图像数据。它们被计算为按比例分配宽度和高度的相同比例,但如果您修改了代码,那么这部分可能没有被正确修改。