在解码android之前获取图像大小(int字节)

时间:2013-05-08 02:57:09

标签: android out-of-memory

我有一个大约4.19 MB(磁盘大小)的图像(3648x2736),我想在我的应用程序中加载它但由于内存不足而崩溃了。因此,为了避免这种崩溃,我在解码图像之前放了一个验证器(不,我不想使用inSampleSize来缩小它。)

    long maxMemory = Runtime.getRuntime().maxMemory();
    long nativeUsage = Debug.getNativeHeapAllocatedSize();
    long heapSize = Runtime.getRuntime().totalMemory();
    long heapRemaining = Runtime.getRuntime().freeMemory();
    long memoryLeft = maxMemory - (heapSize - heapRemaining) - nativeUsage;


    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);
    int bitmapSize = options.outHeight * options.outWidth * 4;

    if (bitmapSize < memoryLeft)
        return BitmapFactory.decodeFile(filePath);

现在我要确定的一件事是,我是否正确计算bitmapSize?因为图像文件大小仅为4.19 MB而memoryLeft大于8 MB,但应用程序崩溃了。这意味着它将每个像素存储为4个字节(PNG),对吗?那么jpeg不应该是3个字节吗?或者还有其他我需要知道的事情吗?

1 个答案:

答案 0 :(得分:1)

由于Bitmap只是一组未压缩的像素,因此不管它是什么格式 - png或jpeg。您应该记住的唯一因素是Bitmap.Config,它描述了位图的颜色方案。例如Config.RGB_565每像素需要2个字节(5位红色,6位绿色,5位绿色通道),Config.ARGB_8888每个像素需要4个字节(每个通道8位)。
您可以使用BitmapFactory.Options.inPreferredConfig解码图像时设置Bitmap.Config,但据我所知BitmapFactory.Options docs,这不能保证。