BitmapFactory.decodeFile导致outOfMemoryError

时间:2014-01-15 22:02:33

标签: android image bitmap out-of-memory

BitmapFactory.decodeFile仅在我从电话库中选择图像时才会导致outOfMemoryError,而不是在我选择拍照时使用相机意图拍摄的图像时。我实际上避免在使用相机意图时使用decodeFile。从图库中选择(从意图中获取数据)时,我可以使用相同的方法吗?以下是我以两种方式获取图像的代码:

如果从设备的图库中选择了图片:

if (requestCode == 1) 
              {
                  if (intent != null && resultcode == RESULT_OK) 
                  {
                  ImageHelper ih = new ImageHelper();
                  mProfilePicPath = ih.getSelectedImageFilePathFromGallery(this, intent);
                  Bitmap portraitPhoto = ih.getChosenImageFromGallery(mProfilePicPath);
                    try{
                        ih.saveImage("Profile pics", portraitPhoto, this);

ImageHelper.getChosenImageFromGallery:

public Bitmap getChosenImageFromGallery(String imagePath) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(imagePath, options);
        options.inSampleSize = DressingRoomActivity.calculateInSampleSize(options, 500, 500);
        options.inJustDecodeBounds = false;
        Bitmap portraitPhoto = ImageHelper.convertToPortraitOrientation(options, imagePath);
        return portraitPhoto;
    }

如果使用相机拍照来选择图像:

else if ((requestCode == CAMERA_REQUEST)&& (resultcode == Activity.RESULT_OK)){
                Bundle extras = intent.getExtras();
                Uri selectedImage = intent.getData();
                if (extras != null) {
                    ImageHelper ih = new ImageHelper();
                    mProfilePicPath = ih.getFilePathFromCameraPhoto(this, selectedImage);
                    Bitmap photo = (Bitmap) intent.getExtras().get("data");
                    try{
                    ih.saveImage("Profile pics", photo, this);

正如您所看到的,要从图库中获取图像并从中获取位图,我必须使用此代码options.inSampleSize = DressingRoomActivity.calculateInSampleSize(options, 500, 500);创建仅500 x 500像素的位图,否则会导致出现outOfMemoryError行Bitmap bmp = BitmapFactory.decodeFile(path, options); ImageHelper.convertToPortraitOrientation(options, imagePath);方法中的行。这意味着用户可以从相机中获取图像的AS IS质量,并从图库中的图像获得500px的质量。

我的问题:1)从图库中选择时,有没有办法让我的图像质量达到500px?就像以某种方式避免这一行:Bitmap bmp = BitmapFactory.decodeFile(path, options);或其他方式?

2)随着画廊我不得不转换成肖像,这只是一个小麻烦,但为什么会这样?如果不这样的话,它会将照片翻转到侧面。

2 个答案:

答案 0 :(得分:1)

Here是关于如何Display Bitmaps Efficiently来自官方文档的完整tuto。我遇到了和你一样的问题。我所做的是在返回我的代码之前阅读并理解给定页面中的所有课程。试试这个,你会让事情更加清晰。

修改

您的应用程序崩溃了,因为您在主线程中运行Bitmap.decode()方法。使用另一个线程(使用简单的AsyncTask)来执行此操作。

正如我之前所说,有a nice tuto on how to handle bitmap off UI Thread

答案 1 :(得分:0)

有两种可能的解决方案可以克服outOfMemory异常:

解决方案1:你应该使用像。

这样的弱引用变量
WeakReference<Bitmap> weakReferenceBitmap=new
             WeakReference<Bitmap>(bitmap);

GC清除weakReference变量与其他变量相比效率更高。

解决方案2:您可以在清单中使用largeHeap属性,然后需要更多的堆空间。

<application
        android:largeHeap="true">

</application>

我不建议您使用第二种解决方案,但它有效:)

希望它会有所帮助:)