Обрезанное изображение не работает с Tess-Two

Я создаю приложение, которое может захватывать изображение с помощью камеры и извлекать текст из изображения, используя библиотеку Android Tess-Two.

Код работает нормально, пока я не добавил опцию обрезки изображения. После обрезки изображения возникает ошибка в строке

tessbaseAPI.setImage(bitmap)

Журнал говорит

Failed to read bitmap

Ниже мой код для обрезки изображения

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();
    }
}

и для выполнения 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");
            }
        }

    }

Строка из журнала

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

Я буду признателен за любую помощь. Спасибо!

1 ответ

Решение

Ну, было много проблем, которые возникали. В целом, я думаю, что основная проблема заключалась в том, что я не смог получить доступ к своей SD-карте. Я где-то читал, что сложно получить доступ к SD-картам в моделях HTC, и я использовал только модель HTC.

Я решил проблему, сохранив обрезанное изображение во внутренней памяти и затем указав путь к tessbaseAPI.setImage(File file)

Функция обрезки стала такой -

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();
    }
}

и onActivityResult() стал этим -

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");
            }
        }

    }

Обратите внимание, что я сделал это -

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

Нам не нужны данные из этой функции, когда мы предоставляем файл, в котором она хранится.

Другие вопросы по тегам