我将用户从图库中选择的图片放在ImageView
。
问题是有时候这些照片会非常大。
离。 ,3648 X 2736
我有一种方法,在检查图像是否大于2048 X 2048后,它通过改变高度来调整大小,但它不起作用。 (它仍然粉碎):
电话:
if(mPhoto.getHeight()>=2048||mPhoto.getWidth()>=2048){
image.setImageBitmap(scaleDownBitmap(mPhoto,200));
方法本身:
public Bitmap scaleDownBitmap(Bitmap photo, int newHeight) {
final float densityMultiplier = getResources().getDisplayMetrics().density;
int h= (int) (newHeight*densityMultiplier);
int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));
photo=Bitmap.createScaledBitmap(photo, w, h, true);
return photo;
}
我甚至不认为该方法会运行...只要从文件中提取图像,就会发生OutOfMemory
崩溃。
我该怎么办?
即使在我用try{}catch{}
..
图片不是drawable文件夹中的资源。它来自相机,画廊或互联网。
我知道我可能接近内存限制,请不要回答明显的问题。问题是如何解决它。
某些大型图像可以在某些设备上运行(具有大量内存的新设备)
对于Ex。同样的图像适用于星系s4但会使星系s1崩溃。
我找不到任何解决方案......
非常感谢!
答案 0 :(得分:1)
你应该回收旧的照片实例。变化
photo=Bitmap.createScaledBitmap(photo, w, h, true);
与
Bitmap toReturn = Bitmap.createScaledBitmap(photo, w, h, true);
photo.recycle();
return toReturn;
另外你应该看看inSampleSize。
答案 1 :(得分:1)
使用BitmapFactory参数探索BitmapFactory.Options方法,这有助于您正确有效地缩放图像,有效避免内存不足。
答案 2 :(得分:1)
检查此链接是否有助http://developer.android.com/training/displaying-bitmaps/load-bitmap.html。另请参阅此链接中的说明https://www.youtube.com/watch?v=pMRnGDR6Cu0
答案 3 :(得分:0)
是的,Bitmap.createScaledBitmap
为您创建了新实例,并且肯定会占用大量内存。您可以尝试使用photo.recycle()
来销毁旧实例,但有时即使您谈论“大”图片也无济于事。
答案 4 :(得分:0)
您可以访问Android开发者网站并查看此Loading Large Bitmaps Efficiently。 Android开发人员提供了有关如何加载大型位图的示例项目。