I am using the ZXing library for barcode scanning.
I want to scan a barcode using this library from an image (e.g., on the SD card) rather than from the camera.
How can I do this using the ZXing library?
Advertisement
Answer
I wanted to test it out before posting it so it took me a while, I’m also using ZXing right now so this comes handy for me as well:
First of course, read the image from the gallery (this can be in your activity):
Intent pickIntent = new Intent(Intent.ACTION_PICK); pickIntent.setDataAndType( android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, 111);
After that, just get the image uri on the activity result and then ZXing will do the magic:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { //the case is because you might be handling multiple request codes here case 111: if(data == null || data.getData()==null) { Log.e("TAG", "The uri is null, probably the user cancelled the image selection process using the back button."); return; } Uri uri = data.getData(); try { InputStream inputStream = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); if (bitmap == null) { Log.e("TAG", "uri is not a bitmap," + uri.toString()); return; } int width = bitmap.getWidth(), height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); bitmap.recycle(); bitmap = null; RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels); BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source)); MultiFormatReader reader = new MultiFormatReader(); try { Result result = reader.decode(bBitmap); Toast.makeText(this, "The content of the QR image is: " + result.getText(), Toast.LENGTH_SHORT).show(); } catch (NotFoundException e) { Log.e("TAG", "decode exception", e); } } catch (FileNotFoundException e) { Log.e("TAG", "can not open file" + uri.toString(), e); } break; } }
I tested this and it works, cheers.