对于 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);
}
这是错的吗?傻吗?
最佳答案
Is this wrong? Stupid?
不,但它可能太不准确了。以字节为单位的文件大小通常不代表内存中的实际图像大小,因为 JPG 和 PNG 等图像文件是 Bitmap
的压缩表示。因此文件大小与图像大小没有直接关系(虽然它们是成比例的,但您不能说 50K JPG 文件一定是 250x250 像素)。
这也意味着磁盘上的 50KB 并不意味着在内存中膨胀成 Bitmap
后的 50KB,因为它是压缩的。图像本身可能会占用接近 300KB(或更多)的内存(ARGB_8888 Bitmap
的要求大约为 W * H * 4 字节)。
进行边界解码允许您根据图像的实际大小(以及它在您的程序中实际占用的内存量)做出此决定。
关于java - 检查文件长度后在 Android 中进行位图采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672734/