Search code examples
androidocrtesseracttess-two

Cropped image not working with tess-two


I am creating an app that can capture image through camera and can extract the text in the image using tess-two library of android.

The code works fine until I added the option of cropping the image. After cropping the image the error occurs on the line

tessbaseAPI.setImage(bitmap)

The log says

Failed to read bitmap

Below is my code for cropping the image

private void performCrop() {
    // take care of exceptions
    try {
        Log.v(TAG, "Inside try of performCrop");
        // call the standard crop action intent (the user device may not
        // support it)
        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        // indicate image type and Uri
        cropIntent.setDataAndType(picUri, "image/*");
        // set crop properties
        cropIntent.putExtra("crop", "true");
        // indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 2);
        cropIntent.putExtra("aspectY", 1);
        // indicate output X and Y
        cropIntent.putExtra("outputX", 256);
        cropIntent.putExtra("outputY", 256);
        // retrieve data on return
        cropIntent.putExtra("return-data", true);
        // start the activity - we handle returning in onActivityResult
        Log.v(TAG, "Going to onActivityResult now");
        startActivityForResult(cropIntent, CROP_PIC);
    }
    // respond to users whose devices do not support the crop action
    catch (ActivityNotFoundException anfe) {
        Toast toast = Toast
                .makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT);
        toast.show();
    }
}

and for performing OCR

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            if (requestCode == REQUEST_IMAGE_CAPTURE) {
                Log.v(TAG, "Request Code is REQUEST_IMAGE_CAPTURE");
                picUri = data.getData();
                performCrop();
            } else if (requestCode == CROP_PIC) {
                Log.v(TAG, "Request Code is CROP_PIC");
                Bundle extras = data.getExtras();
                Bitmap bitmap = extras.getParcelable("data");
                TextView res = (TextView) findViewById(R.id.hello);
                //imageView.setImageBitmap(imageBitmap);
                //Image image = ImageIO.read(imageFile);
                //BufferedImage buffimg = (BufferedImage) image;
                //BufferedImage img = ImageHelper.convertImageToGrayscale(buffimg);
                //ITesseract instance = new Tesseract();  // JNA Interface Mapping
                //ITesseract instance = new Tesseract1(); // JNA Direct Mapping

                //TessDataManager.initTessTrainedData(context);
                if (isStoragePermissionGranted() == true) {
                    TessBaseAPI tessBaseAPI = new TessBaseAPI();

                    String path = Environment.getExternalStorageDirectory() + "/";
                    //String path = "/mnt/sdcard/";

                    tessBaseAPI.setDebug(true);
                    tessBaseAPI.init(path, "eng");


                    tessBaseAPI.setImage(bitmap);

                    String text = tessBaseAPI.getUTF8Text();
                    tessBaseAPI.end();
                    res.setText(text);
                }
            }} else {
                TextView res = (TextView) findViewById(R.id.hello);
                res.setText("Well damn");
            }
        }

    }

A line from log

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.abc.snaptravel/com.example.abc.snaptravel.MainActivity}: java.lang.RuntimeException: Failed to read bitmap

I will appreciate any help. Thank you!


Solution

  • Well there were a LOT of problems that were coming up. Overall I think the main problem was that I wasn't able to access my SD card. I read somewhere that it is tough to access SD cards in HTC models and I was using an HTC model only.

    I solved the problem by saving my cropped image in the internal memory and then giving that path to the tessbaseAPI.setImage(File file)

    The crop function became this -

    private void performCrop() {
        // take care of exceptions
        try {
            Log.v(TAG, "Inside try of performCrop");
            // call the standard crop action intent (the user device may not
            // support it)
            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            cropIntent.setDataAndType(picUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 2);
            cropIntent.putExtra("aspectY", 1);
            // indicate output X and Y
            cropIntent.putExtra("outputX", 256);
            cropIntent.putExtra("outputY", 256);
            File dir=
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    
            output=new File(dir, "CameraContentDemo.jpg");
            cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));
            // retrieve data on return
            cropIntent.putExtra("return-data", false);
            // start the activity - we handle returning in onActivityResult
            Log.v(TAG, "Going to onActivityResult now");
            startActivityForResult(cropIntent, CROP_PIC);
        }
        // respond to users whose devices do not support the crop action
        catch (ActivityNotFoundException anfe) {
            Toast toast = Toast
                    .makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }
    

    and the onActivityResult() became this -

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                if (requestCode == REQUEST_IMAGE_CAPTURE) {
                    Log.v(TAG, "Request Code is REQUEST_IMAGE_CAPTURE");
                    picUri = data.getData();
                    performCrop();
                } else if (requestCode == CROP_PIC) {
                    Log.v(TAG, "Request Code is CROP_PIC");
                    Bundle extras = data.getExtras();
                    //Bitmap bitmap = (Bitmap)extras.get("data");
                    TextView res = (TextView) findViewById(R.id.hello);
                    ImageView im = (ImageView)findViewById(R.id.imageView);
                    //im.setImageBitmap(bitmap);
                    //imageView.setImageBitmap(imageBitmap);
                    //Image image = ImageIO.read(imageFile);
                    //BufferedImage buffimg = (BufferedImage) image;
                    //BufferedImage img = ImageHelper.convertImageToGrayscale(buffimg);
                    //ITesseract instance = new Tesseract();  // JNA Interface Mapping
                    //ITesseract instance = new Tesseract1(); // JNA Direct Mapping
    
                    //TessDataManager.initTessTrainedData(context);
                    if (isStoragePermissionGranted() == true) {
                        TessBaseAPI tessBaseAPI = new TessBaseAPI();
    
                        String path = Environment.getExternalStorageDirectory() + "/";
                        //String path = "/mnt/sdcard/";
    
                        tessBaseAPI.setDebug(true);
                        tessBaseAPI.init(path, "eng");
                        File file = new File(picUri.getPath());
                        tessBaseAPI.setImage(output);
    
                        String text = tessBaseAPI.getUTF8Text();
                        tessBaseAPI.end();
                        res.setText(text);
                    }
                }} else {
                    TextView res = (TextView) findViewById(R.id.hello);
                    res.setText("Well damn");
                }
            }
    
        }
    

    Note that I have done this -

    cropIntent.putExtra("return-data", false);
    

    We don't need data from this function when we are providing the file it is stored in.