解码android之前获取图像大小(整数字节)

解码android之前获取图像大小(整数字节),android,out-of-memory,Android,Out Of Memory,我有一个大约4.19 MB(磁盘大小)的映像(3648x2736),我想将它加载到我的应用程序中,但它因内存不足而崩溃。因此,为了避免此类崩溃,我在解码图像之前放置了一个验证器(不,我不想使用inSampleSize使其更小) long maxMemory=Runtime.getRuntime().maxMemory(); long nativeUsage=Debug.GetNativeHeapLocatedSize(); long heapSize=Runtime.getRuntime().t

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

long maxMemory=Runtime.getRuntime().maxMemory();
long nativeUsage=Debug.GetNativeHeapLocatedSize();
long heapSize=Runtime.getRuntime().totalMemory();
long heapRemaining=Runtime.getRuntime().freemory();
long memoryLeft=maxMemory-(heapSize-heapRemaining)-nativeUsage;
BitmapFactory.Options=new-BitmapFactory.Options();
options.inJustDecodeBounds=true;
解码文件(文件路径,选项);
int bitmapSize=options.outHeight*options.outWidth*4;
if(位图大小

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

因为位图只是一组未压缩的像素,不管它是什么格式-png或jpeg或其他格式。您应该记住的唯一因素是描述位图颜色方案的
Bitmap.Config
。例如,
Config.RGB_565
每像素需要2个字节(5位红色、6位绿色、5位绿色通道),而
Config.ARGB_8888
每像素需要4个字节(每个通道8位)。

您可以在解码图像时使用
BitmapFactory.Options.inPreferredConfig
设置Bitmap.Config,但据我所知,这并不能保证。

运行时
bitmapSize
memoryLeft
的实际值是多少?正如您所说,4.19MB只是磁盘中映像的大小。解码后,即使您仅使用每像素1字节,它也是3648*2736=9980928,这已经远远超过9MB。
memoryLeft
约为8MB,而
bitmapSize
约为35MB
    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);