请先阅读完整的问题,然后再将其标记为重复或否决。
我正在开发一个应用程序,该应用程序可以对图片进行切片,并运行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);
}
}
这是我要切成薄片的图像类型
答案 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链接很有帮助。