我有一个大约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个字节吗?或者还有其他我需要知道的事情吗?
答案 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,这不能保证。