OutOfMemory处理图像时出现异常

时间:2011-07-25 12:11:02

标签: java android

  

可能重复:
  OutOfMemoryError: bitmap size exceeds VM budget :- Android

我正在编写一个程序,该程序使用来自图库的图像,然后在活动中显示它们(一个图像pr。活动)。然而,我一直在连续三天碰到这个错误而没有取消它的任何进展:

07-25 11:43:36.197: ERROR/AndroidRuntime(346): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我的代码流程如下:

当用户按下某个按钮时,会触发通往图库的意图:

 Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
 galleryIntent.setType("image/*");
 startActivityForResult(galleryIntent, 0);

用户选择图像后,图像将以图像视图显示:

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical">

<ImageView
    android:background="#ffffffff"
    android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:maxWidth="250dip"
    android:maxHeight="250dip"
    android:adjustViewBounds="true"/>

 </LinearLayout>

在onActivityResult方法中我有:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(resultCode == RESULT_OK) {
        switch(requestCode) {
        case 0:             // Gallery
            String realPath = getRealPathFromURI(data.getData());
            File imgFile = new File(realPath);
            Bitmap myBitmap;
            try {
                myBitmap = decodeFile(imgFile);
                Bitmap rotatedBitmap = resolveOrientation(myBitmap);
                img.setImageBitmap(rotatedBitmap);
                OPTIONS_TYPE = 1;
            } catch (IOException e) { e.printStackTrace(); }

            insertImageInDB(realPath);

            break;
        case 1:             // Camera

decodeFile方法来自here,resolveOrientation方法只是将位图包装成矩阵并顺时针旋转90度。

我真的希望有人可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

这是因为您的位图大小很大,因此请手动或通过编程方式缩小图像大小

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap = BitmapFactory.decodeFile(mPathName, options);

答案 1 :(得分:1)

您的GC无法运行。尝试逐个获取位图

BitmapFactory.Options buffer = new BitmapFactory.Options(); 
buffer.inSampleSize = 4; 
Bitmap bmp = BitmapFactory.decodeFile(path, buffer); 

答案 2 :(得分:1)

Stackoverflow中有很多关于bitmap size exceeds VM budget的问题,所以首先搜索一下您的问题,当您找不到任何解决方案时,请在此处提出问题

答案 3 :(得分:1)

问题是因为您的位图的大小太大而不是VM可以处理的。例如,从您的代码中我可以看到您正在尝试将Image粘贴到使用Camera捕获的imageView中。所以通常相机图像的尺寸太大会明显地增加这个错误。 正如其他人所建议的那样,您必须通过采样或将图像转换为更小的分辨率来压缩图像。 例如,如果您的imageView的宽度和高度为100x100,则可以创建缩放的位图,以便精确填充imageView。你可以这样做,

    Bitmap newImage = Bitmap.createScaledBitmap(bm, 350, 300,true);

或者您可以使用用户hotveryspicy建议的方法对其进行抽样。