我正在做一个画廊形象。我在设备中获取图像路径并解析为URI。
然后我使用Picasso Android Lib将图像加载到Imageview
中的Gridview
。它有效,直到有一个大图像。毕加索无法加载大图像。我收到错误Out Of Memory
。是否有任何建议将大图片加载到ImageView
?有任何lib可以将图像加载到ImageView
而不是Picasso吗?
答案 0 :(得分:1)
我为我的问题找到了ImageLoader lib。它工作正常。我测试了我的项目,然后我看到ImageLoader看起来比Picasso好。
答案 1 :(得分:0)
了解如何使用常用技术来处理和加载Bitmap对象,使用户界面(UI)组件保持响应并避免超出应用程序内存限制。如果您不小心,位图可能会快速消耗您的可用内存预算,从而导致应用程序崩溃,因为可怕的异常: java.lang.OutofMemoryError:位图大小超过VM预算。
为什么在Android应用程序中加载位图很棘手有很多原因:
移动设备通常具有受限制的系统资源。 Android设备可以为单个应用程序提供少至16MB的内存。 Android兼容性定义文档(CDD),第3.7节。虚拟机兼容性为各种屏幕尺寸和密度提供所需的最小应用程序内存。应优化应用程序以在此最小内存限制下执行。但是,请记住,许多设备配置了更高的限制。
Bitmaps会占用大量内存,尤其是对于像照片这样的丰富图像。例如,Galaxy Nexus上的相机拍摄的照片最高可达2592x1936像素(5百万像素)。如果使用的位图配置是ARGB_8888(默认情况下从Android 2.3开始),则将此图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),这会立即耗尽某些设备上的每个应用程序限制。 Android应用UI通常需要一次加载几个位图。 ListView,GridView和ViewPager等组件通常会同时在屏幕上显示多个位图,并且可以在屏幕上轻松显示更多可能的屏幕外显示。
答案 2 :(得分:0)
这是我曾经使用的一个例子,但它并不完美! (对不起)
您可以缩小位图大小:
public Bitmap resizeBitmap(Bitmap bitmap) {
if (bitmap.getHeight() > 4096 || bitmap.getWidth() > 4096) {
int width = (int) (bitmap.getWidth() * 0.9);
int height = (int) (bitmap.getHeight() * 0.9);
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
resizeBitmap(resizedBitmap);
returnresizedBitmap;
} else {
return bitmap;
}
}
如果我应该再做一次:(未经测试)
public Bitmap resizeBitmap(Bitmap bitmap) {
int originalWidth = bitmap.getWidth();
int originalHeight = bitmap.getHeight();
if (originalWidth > 4096 || originalHeight > 4096) {
int height;
int width;
if(originalHeight > originalWidth) {
height = 4096;
width = originalWidth / (originalHeight / 4096);
} else {
width = 4096;
height = originalHeight / (originalWidth / 4096);
}
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
return resizedBitmap;
} else {
return bitmap;
}
}
答案 3 :(得分:0)
您可以为您的目的自定义recent-images库。它非常简单易用。它会创建一个图像缩略图,以便在gridview中显示,然后在单击中打开原始图像。