如何使位图在Android上占用更少的内存?

时间:2015-11-03 20:50:37

标签: android bitmap

我有一组存储在内部存储中的图像文件,每个文件大小约为750 KB。我需要创建一个像这个图像一样的360度动画,因此,我将每个图像加载到一个列表中,而我正在执行此过程时出现内存不足异常。 我一直在阅读关于Android上的位图处理,但在这种情况下不是关于调整位图尺寸,尺寸是好的(600,450),因为它的平板电脑应用程序,我认为是关于图像质量。 有没有办法减少每个位图占用的内存?。

2 个答案:

答案 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中删除当前不可见的位图,并在需要时从磁盘重新加载。