我有一组存储在内部存储中的图像文件,每个文件大小约为750 KB。我需要创建一个像这个图像一样的360度动画,因此,我将每个图像加载到一个列表中,而我正在执行此过程时出现内存不足异常。 我一直在阅读关于Android上的位图处理,但在这种情况下不是关于调整位图尺寸,尺寸是好的(600,450),因为它的平板电脑应用程序,我认为是关于图像质量。 有没有办法减少每个位图占用的内存?。
答案 0 :(得分:1)
这里有一个很好的资源如何做到这一点: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
基本上,您需要使用以下两个函数以不同的分辨率加载位图:
step = 0.01
然后按如下方式设置图像:
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
希望有所帮助!
答案 1 :(得分:0)
如果不缩小图像尺寸,则无法实现。
所有具有相同尺寸的图像都需要相同数量的RAM,无论其大小和磁盘尺寸如何。图形适配器不了解不同的图像类型和压缩,它只需要未压缩的原始像素阵列。它的大小是恒定的
例如
size = width * height * 4; // for RGBA_8888
size = width * height * 2; // for RGB_565
因此,您应该减少图像尺寸或在磁盘上使用缓存,并从RAM中删除当前不可见的位图,并在需要时从磁盘重新加载。