检查文件长度后,在Android中进行位图采样

时间:2012-12-02 19:11:24

标签: java android bitmap

对于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);
    }

这是错的吗?傻?

3 个答案:

答案 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)

关于类似主题Loading Large Bitmaps Efficiently

的Android文档