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

标签 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);
    }

这是错的吗?傻吗?

最佳答案

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/

相关文章:

java - kotlin 对象实例上的装饰器

java - 如何修复此 .bat 文件以便它可以在 macOS 中运行?

java - Box2d 水上摩托艇

java - 在单个 Activity 中动态实现多个 fragment

c++ - 从cpp中的mysql blob解析BMP文件

android图像不保持纵横比

java - 在 JUnit @BeforeClass 中加载属性文件

java - 如何正确比较排序方法快速排序和归并排序之间的运行时间?

android - Mac 上的 Meteor 1.3.3 运行 android : Android target: Android SDK not found

android - 为什么 res/raw 文件夹中的位图为空?