EDIT:
Поработав с ним несколько часов, я пришел к выводу, что проблема заключается в качестве изображения. Например, к первому изображению относится то, как оно пришло с камеры. Декодер не может прочитать это. Второе изображение преобразуется в черно-белый с отрегулированным контрастом, и декодер отлично его читает.
Поскольку демонстрационное приложение, поставляемое с zxing, может считывать изображение с монитора в течение нескольких секунд, я думаю, что проблема может заключаться в некоторых настройках глубоко внутри библиотеки zxing. Процесс обработки изображения не длится достаточно долго, но почти мгновенно выплевывает NotFound.
Я делаю простое приложение для чтения QR-кодов. Вот скриншот.
Верхняя черная область - это вид с поверхности, на котором показаны кадры с камеры. Работает нормально, только на скриншоте это не видно.
Затем, когда я нажимаю кнопку, из этого вида поверхности берется растровое изображение, помещаемое в 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 из этого скриншота, помещаю его в представление изображений (вместо канала камеры) и пытаюсь декодировать, оно работает нормально. Поэтому само изображение 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);
}
}