Android: 将大图像从存储加载到 ImageView
Android: Load large image from storage into ImageView
我正在制作画廊图片。我在设备中获取图像路径并解析为 URI。
然后我使用 Picasso Android Lib 将图像加载到 Gridview
中的 Imageview
。它工作正常,直到有一个大图像。毕加索无法加载大图像。我收到错误 Out Of Memory
。有没有建议将大图像加载到 ImageView
?并有任何库将图像加载到 ImageView
可以代替毕加索吗?
了解如何使用常用技术以保持用户界面 (UI) 组件响应并避免超出应用程序内存限制的方式处理和加载位图对象。如果您不小心,位图会迅速消耗您的可用内存预算,导致应用程序因可怕的异常而崩溃:
java.lang.OutofMemoryError: 位图大小超出 VM 预算。
在您的 Android 应用程序中加载位图很棘手的原因有很多:
移动设备通常具有受限的系统资源。 Android 设备可以为单个应用程序提供低至 16MB 的可用内存。 Android 兼容性定义文档 (CDD),第 3.7 节。虚拟机兼容性为各种屏幕尺寸和密度提供了所需的最小应用程序内存。应优化应用程序以在此最小内存限制下执行。但是,请记住,许多设备都配置了更高的限制。
位图占用大量内存,尤其是照片等丰富的图像。例如,Galaxy Nexus 上的相机可拍摄高达 2592x1936 像素(5 百万像素)的照片。如果使用的位图配置是 ARGB_8888(从 Android 2.3 开始的默认配置),那么将此图像加载到内存中需要大约 19MB 的内存(2592*1936*4 字节),立即耗尽每个应用程序限制某些设备。
Android 应用 UI 经常需要同时加载多个位图。 ListView、GridView 和 ViewPager 等组件通常在屏幕上同时包含多个位图,还有更多潜在的屏幕外位图随时可以在手指轻弹时显示。
这是我曾经用过的例子,但并不完美! (抱歉)
您可以减小位图大小:
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;
}
}
您可以根据自己的目的自定义 recent-images 库。这是一个非常简单易用的库。它创建一个图像缩略图以在 gridview 中显示,然后单击打开原始图像。
我找到了 ImageLoader 库来解决我的问题。它工作正常。我在我的项目上进行了测试,然后我发现 ImageLoader 看起来比 Picasso 更好。
我正在制作画廊图片。我在设备中获取图像路径并解析为 URI。
然后我使用 Picasso Android Lib 将图像加载到 Gridview
中的 Imageview
。它工作正常,直到有一个大图像。毕加索无法加载大图像。我收到错误 Out Of Memory
。有没有建议将大图像加载到 ImageView
?并有任何库将图像加载到 ImageView
可以代替毕加索吗?
了解如何使用常用技术以保持用户界面 (UI) 组件响应并避免超出应用程序内存限制的方式处理和加载位图对象。如果您不小心,位图会迅速消耗您的可用内存预算,导致应用程序因可怕的异常而崩溃: java.lang.OutofMemoryError: 位图大小超出 VM 预算。
在您的 Android 应用程序中加载位图很棘手的原因有很多:
移动设备通常具有受限的系统资源。 Android 设备可以为单个应用程序提供低至 16MB 的可用内存。 Android 兼容性定义文档 (CDD),第 3.7 节。虚拟机兼容性为各种屏幕尺寸和密度提供了所需的最小应用程序内存。应优化应用程序以在此最小内存限制下执行。但是,请记住,许多设备都配置了更高的限制。
位图占用大量内存,尤其是照片等丰富的图像。例如,Galaxy Nexus 上的相机可拍摄高达 2592x1936 像素(5 百万像素)的照片。如果使用的位图配置是 ARGB_8888(从 Android 2.3 开始的默认配置),那么将此图像加载到内存中需要大约 19MB 的内存(2592*1936*4 字节),立即耗尽每个应用程序限制某些设备。 Android 应用 UI 经常需要同时加载多个位图。 ListView、GridView 和 ViewPager 等组件通常在屏幕上同时包含多个位图,还有更多潜在的屏幕外位图随时可以在手指轻弹时显示。
这是我曾经用过的例子,但并不完美! (抱歉)
您可以减小位图大小:
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;
}
}
您可以根据自己的目的自定义 recent-images 库。这是一个非常简单易用的库。它创建一个图像缩略图以在 gridview 中显示,然后单击打开原始图像。
我找到了 ImageLoader 库来解决我的问题。它工作正常。我在我的项目上进行了测试,然后我发现 ImageLoader 看起来比 Picasso 更好。