对于Android,将图像加载到内存中以确保我们不会超过RAM限制,我们通常会这样做
BitmapFactory.Options bounds = new BitmapFactory.Options();
bounds.inJustDecodeBounds = true;
然后解码位图以找到它的宽度,我们可以决定是否根据它进行采样。
我的问题是,如果我们从本地存储(SD卡)加载位图,我们不能得到位图的文件位置:
File file = new File(mPathToFile);
然后检查
if(file.length()>MAX){
sampleSize = 2;//2 is just an example
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = sampleSize;
bitmap = BitmapFactory.decodeFile(mPathToFile, options);
}
这是错的吗?傻?
答案 0 :(得分:2)
这是错的吗?傻?
不,但可能太不准确了。文件大小(以字节为单位)通常不代表内存中的实际图像大小,因为像JPG和PNG这样的图像文件是Bitmap
的压缩表示。因此文件大小与图像大小没有直接关联(虽然它们是成比例的,但您不一定要说50K JPG文件将是250x250像素)。
这也意味着磁盘上的50KB并不意味着在内存中膨胀到Bitmap
后50KB,因为它是压缩的。图像本身可能在内存中接近300KB(或更多)(对于ARGB_8888 Bitmap
,要求大致为W * H * 4字节)。
执行边界解码允许您根据图像的实际大小(以及它在程序中实际占用的内存量)做出此决定。
答案 1 :(得分:1)
据我所知,用于处理位图的堆内存与图像分辨率相关联,而不是文件的物理大小/长度。
我的理解是,分辨率为1280 x 800的图像A使用/需要的堆比640 x 400的图像B更多。并且根据B的质量文件大小可能大于A.如果我错了,请纠正我< / p>
答案 2 :(得分:0)