Search code examples
javaandroidqr-codezxing

Scaning QRcode from image (not from camera) using ZXing


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?


Solution

  • 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.