Пожалуйста, прочитайте полный вопрос, прежде чем пометить его как дубликат или проголосовать за него.

Я разрабатываю приложение, которое может разрезать изображение и запустить Google Vision, чтобы распознать текст в каждом фрагменте или фрагменте изображения, и запустить OCR, чтобы определить, заполнен или нет пузырек круга в блоке. но когда я нарезаю растровое изображение в массиве и передаю его другому действию для процесса, он падает из-за чрезмерного использования памяти. Я знаю, что могу сжать его, но я уже пытался это сделать (хотя я не хотел сжимать его, так как мне нужно запустить Google Vision и, возможно, не в состоянии извлечь текст точно), но это не сработало, так как есть 46 фрагментов изображения. Как я могу сделать это, не загружая в облако, получить его снова для процесса, так как это может занять много времени. Любое альтернативное решение также приветствуется. Я застрял на этом довольно долго.

import android.content.Intent;.....

public class ProcessesdResult extends AppCompatActivity {

TextView tvProcessedText;
Button btnImageSlice;
Bitmap image;
int chunkNumbers =46;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_processesd_result);

    Intent intenttakeattendance = getIntent();
    String fname = intenttakeattendance.getStringExtra("fname");

    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root);

    String photoPath = myDir+"/sams_images/"+ fname;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    image = BitmapFactory.decodeFile(photoPath, options);


    btnImageSlice=findViewById(R.id.btnimageslice);
    btnImageSlice.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            splitImage(image, chunkNumbers) ;
        }
    });

}


    private void splitImage(Bitmap image, int chunkNumbers) {

        //For the number of rows and columns of the grid to be displayed
        int rows =23;
        int cols =2;

        //For height and width of the small image chunks
        int chunkHeight,chunkWidth;

        //To store all the small image chunks in bitmap format in this list
        ArrayList<Bitmap> chunkedImages = new ArrayList<Bitmap>(chunkNumbers);

        //Getting the scaled bitmap of the source image


        Bitmap scaledBitmap = Bitmap.createScaledBitmap(image, image.getWidth(), image.getHeight(), true);

        chunkHeight = image.getHeight()/rows;
        chunkWidth = image.getWidth()/cols;

        //xCoord and yCoord are the pixel positions of the image chunks
        int yCoord = 0;
        for(int x=0; x<rows; x++){
            int xCoord = 0;
            for(int y=0; y<cols; y++){
                chunkedImages.add(Bitmap.createBitmap(scaledBitmap, xCoord, yCoord, chunkWidth, chunkHeight));
                xCoord += chunkWidth;
            }
            yCoord += chunkHeight;
        }

        //Start a new activity to show these chunks into a grid
        Intent intent = new Intent(ProcessesdResult.this, ChunkedImageActivity.class);
        intent.putParcelableArrayListExtra("image chunks", chunkedImages);
        startActivity(intent);
    }


}

Это тип изображения, которое я хочу разрезать на части Это тип изображения, который я хочу разрезать на куски

-1
MEHEDI HASAN 20 Авг 2018 в 11:38

3 ответа

Лучший ответ

Вы не хотите передавать объекты между действиями, особенно не огромные объекты, такие как растровые изображения. Я бы предложил сохранить ваши растровые изображения в файловой системе устройств, а затем передать список URI. Сохранение подобных растровых изображений и повторное использование растровых изображений после их использования также должно снизить использование ОЗУ во время цикла, когда вы разрезаете изображение.

Для сохранения растровых изображений в виде файлов я хотел бы обратиться к этому вопросу: Сохранение и чтение растровых изображений / изображений из внутренней памяти в Android

В общем, ваш цикл должен выглядеть так:

for(int x=0; x<rows; x++){
        int xCoord = 0;
        for(int y=0; y<cols; y++){
            Bitmap image = Bitmap.createBitmap(scaledBitmap, xCoord, yCoord, chunkWidth, chunkHeight);
            Uri uri = saveBitmapAsFile(image);
            image.recycle();
            xCoord += chunkWidth;
        }
        yCoord += chunkHeight;
    }
0
StarterPack 20 Авг 2018 в 11:51

Используйте android: largeHeap = "true" в манифесте, если вы по-прежнему получаете ту же ошибку, а затем попробуйте это: вместо отправки "intent.putParcelableArrayListExtra (" image chunks ", chunkedImages);" растровое изображение для другой деятельности, сохраните это изображение в локальном хранилище и используйте путь, где вы хотите.

0
Rahul Singh 20 Авг 2018 в 08:51

Я рекомендовал для создания другого класса хранилища данных (Bitmap) со статическим. Используйте этот класс для сохранения растровых изображений и вызовите другое действие для чтения.

Эта ссылка полезна.

0
seokrae.kim 24 Авг 2018 в 05:53
51926971