位图“图像”传递到另一个活动(内存不足)

时间:2018-08-20 08:38:48

标签: java android image-processing bit-manipulation android-bitmap

请先阅读完整的问题,然后再将其标记为重复或否决。

我正在开发一个应用程序,该应用程序可以对图片进行切片,并运行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);
    }


}

这是我要切成薄片的图像类型 This is the image type i want to slice in pieces

3 个答案:

答案 0 :(得分:0)

您不想在活动之间传递对象,尤其是像位图之类的大对象时。我建议将位图保存在设备文件系统中,然后传递URI列表。保存这样的位图,并在使用完位图后对其进行回收,这还可以减少对图像进行切片的循环期间的RAM使用量。

要将位图另存为文件,我会参考以下问题:Saving and Reading Bitmaps/Images from Internal memory in 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;
    }

答案 1 :(得分:0)

在清单中使用android:largeHeap =“ true”如果仍然出现相同的错误,请尝试以下操作: 而不是发送“ intent.putParcelableArrayListExtra(“ image chunks”,chunkedImages);“ 位图到另一个活动,将该图像保存到本地存储,并在任何需要的位置使用路径。

答案 2 :(得分:0)

我建议使用静态方法创建另一个数据(位图)存储类。 使用此类可保存位图,并调用另一个活动进行读取。

This链接很有帮助。