编辑:
玩了几个小时后,我开始相信问题出在图像质量上。例如,第一张图片是它如何来自相机。解码器无法读取它。第二张图片变成了调整对比度的黑白图像,解码器读取效果很好。
由于 zxing 附带的演示应用程序能够在几秒钟内从显示器读取第一张图像,我认为问题可能出在 zxing 库深处的某个设置中。它没有等待足够长的时间来处理图像,而是几乎立即吐出 NotFound。
我正在制作一个简单的二维码阅读器应用。这是一个截图。 顶部的黑色区域是表面 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 图像本身及其质量还可以...但是为什么它在第一种情况下不解码?
谢谢!
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/