android - 无法从相机读取二维码

标签 android zxing

编辑:

玩了几个小时后,我开始相信问题出在图像质量上。例如,第一张图片是它如何来自相机。解码器无法读取它。第二张图片变成了调整对比度的黑白图像,解码器读取效果很好。

由于 zxing 附带的演示应用程序能够在几秒钟内从显示器读取第一张图像,我认为问题可能出在 zxing 库深处的某个设置中。它没有等待足够长的时间来处理图像,而是几乎立即吐出 NotFound。

enter image description here enter image description here


我正在制作一个简单的二维码阅读器应用。这是一个截图。 顶部的黑色区域是表面 View ,显示来自相机的帧。它工作正常,只是你在屏幕截图中看不到它。

然后,当我按下按钮时,会从该 surfaceview 中获取位图,并将其放置在下面的 ImageView 上,并尝试由 zxing 库读取。

然而它会给出一个 NotFoundException。 :/

**10-17 19:53:15.382: WARN/System.err(2238): com.google.zxing.NotFoundException
10-17 19:53:15.382: WARN/dalvikvm(2238): getStackTrace() called but no trace available**

另一方面,如果我从此屏幕截图中裁剪 qr 图像,将其放入 imageview(而不是相机源)并尝试对其进行解码,它工作正常。因此 QR 图像本身及其质量还可以...但是为什么它在第一种情况下不解码?

谢谢!

enter image description here

public void dec(View v)
{

ImageView ivCam2 = (ImageView)findViewById(R.id.imageView2);
ivCam2.setImageBitmap(bm);

BitmapDrawable drawable = (BitmapDrawable) ivCam2.getDrawable();
Bitmap bMap = drawable.getBitmap();

TextView textv = (TextView) findViewById(R.id.mytext);

LuminanceSource source = new RGBLuminanceSource(bMap); 
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Reader reader = new MultiFormatReader();
try {
     Result result = reader.decode(bitmap);
     Global.text = result.getText(); 
        byte[] rawBytes = result.getRawBytes(); 
        BarcodeFormat format = result.getBarcodeFormat(); 
        ResultPoint[] points = result.getResultPoints();
        textv.setText(Global.text);

} catch (NotFoundException e) {
    textv.setText("NotFoundException");
} catch (ChecksumException e) {
    textv.setText("ChecksumException");
} catch (FormatException e) {
    textv.setText("FormatException");
}  

}

位图是如何创建的:

    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {
            try
            {
                    this.camera = Camera.open();
                    this.camera.setPreviewDisplay(this.holder);

                    this.camera.setPreviewCallback(new PreviewCallback() {

                      public void onPreviewFrame(byte[] _data, Camera _camera) {

                        Camera.Parameters params = _camera.getParameters();
                           int w = params.getPreviewSize().width;
                           int h = params.getPreviewSize().height;
                           int format = params.getPreviewFormat();
                           YuvImage image = new YuvImage(_data, format, w, h, null);

                           ByteArrayOutputStream out = new ByteArrayOutputStream();
                           Rect area = new Rect(0, 0, w, h);
                           image.compressToJpeg(area, 50, out);

                           bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

                      }
                    });

            }
            catch(IOException ioe)
            {
                    ioe.printStackTrace(System.out);
            }
    }

最佳答案

我写了这段代码。快速返回不是问题。解码在移动设备上非常快,在桌面设备上非常非常快。

这类问题的一般答案是,有些图像无法解码。这就是生活——启发法并不总是正确的。但我认为这不是这里的问题。

如果周围没有最小的白色“静区”,QR 码就无法解码。为此,超出其边界的图像被认为是白色的。但是在你的原始相机图像中,代码周围几乎没有边框,而且二值化器并不认为它都是白色的,我敢打赌。

不过,您还可以做更多的事情。为解码器设置 TRY_HARDER 提示,一方面,让它花费更多的 CPU 来尝试解码。您还可以尝试使用与默认 HybridBinarizer 不同的 Binarizer 实现。

(其余的看起来很好。我假设 RGBLuminanceSource 正在以它期望的格式获取数据;它应该来自 Bitmap)

关于android - 无法从相机读取二维码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796744/

相关文章:

android - 如果使用 FLAG_LAYOUT_NO_LIMITS,则无法使用 setStatusBarColor 设置 StatusBar 颜色

android - android 有垃圾收集功能吗?它有多快?

android - Phonegap PluginManager 无法使用 --rename-manifest-package 加载 plugins/config.xml

java - ViewPager2 堆栈 PageTransform

android - zxing 如何从文件中解码?

java - 如何使用 HTML 颜色通过 zxing 编写二维码

android - 使用 MediaCodec 和 MediaExtractor 对视频进行解码编码

android - 如何在android中解析zxing条码库中的内容

java - 在 ZXing 生成的 QR 码上删除边距/边框空间并将 ErrorCorrectionLevel 设置为 'H'?

android - ZXing如何扫描二维码和一维条码?