尝试从字节数组构造位图时出现OutofMemoryError

时间:2013-05-06 10:32:23

标签: android bitmap android-imageview android-image

我从blob类型获取字节数组,而存储在db中,它适用于小图像但是当图像大小超过200kb时,它会给我一个错误的错误。 我该怎么做才能克服这种错误

照片是我的字节数组

ByteArrayInputStream imageStream = new ByteArrayInputStream(photo);
            Bitmap theImage= BitmapFactory.decodeStream(imageStream);
            Bitmap bitmapScaled = Bitmap.createScaledBitmap(theImage, 100,80, true);
            Drawable drawable = new BitmapDrawable(bitmapScaled);
            imgPath.setBackgroundDrawable(drawable);
            imgPath.setScaleType(ImageView.ScaleType.FIT_END);

Logcat错误

05-06 15:55:38.871: E/AndroidRuntime(2647): FATAL EXCEPTION: main
05-06 15:55:38.871: E/AndroidRuntime(2647): java.lang.OutOfMemoryError
05-06 15:55:38.871: E/AndroidRuntime(2647):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-06 15:55:38.871: E/AndroidRuntime(2647):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
05-06 15:55:38.871: E/AndroidRuntime(2647):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549)
05-06 15:55:38.871: E/AndroidRuntime(2647):     at com.example.hotelmenu.RevisedMainMenu.displayMenu(RevisedMainMenu.java:655)
05-06 15:55:38.871: E/AndroidRuntime(2647):     at com.example.hotelmenu.RevisedMainMenu.onClick(RevisedMainMenu.java:615)

1 个答案:

答案 0 :(得分:2)

图像尺寸无关紧要。宽度和高度都很重要。实际上,您的Bitmap实例将保留width*height*4个字节。如果您收到OOM,我建议您对Bitmap进行缩减采样。

另外

 Bitmap theImage= BitmapFactory.decodeStream(imageStream);
 Bitmap bitmapScaled = Bitmap.createScaledBitmap(theImage, 100,80, true);

在您创建的代码段中,在创建bitmapScaled之后,从未使用过的图像。你应该回收它来调用

theImage.recycle().

编辑。此代码段将创建比原始

宽1/4的位图
 BitmapFactory.Options options=new BitmapFactory.Options();
 options.inSampleSize = 4;
 Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream, null, options );