android - 解码bitmapfactory两次有什么用?

标签 android imageview bitmapfactory

我在开发者网站上的“高效加载大型位图”教程中看到了这一点。

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
    int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    **BitmapFactory.decodeResource(res, resId, options);**

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

我的问题是第一次解码资源有什么意义,您可以在其中设置 inSampleSize 然后对其进行解码。

最佳答案

这是下载图片时的常用策略。

由于您几乎不想下载比显示分辨率更高的图像,并且由于 Android 在内存管理方面相当困难,因此该系统允许您首先评估图像的大小,当您实际下载时,您可以控制所需的下采样量。

简而言之,下采样意味着您要跳过多少像素。例如,1 的下采样不会减少。然而,2 的下采样将在水平和垂直方向上每隔一个像素跳过一次,从而导致位图的宽度和高度分别为一半和四分之一的内存。

如果您查看这段代码:

final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    **BitmapFactory.decodeResource(res, resId, options);**

这里发生的事情是在调用“decodeResource”时,您传递了一个 Options 对象,其中 inJustDecodeBounds = true。这是告诉 BitmapFactory 实际上不加载图像像素,而是只解码图像的边界 - 一个更便宜的操作。当你这样做时,BitmapFactory 的结果是 null,但是 Options 的参数(outWidth, outHeight)将具有描述图像宽度/高度的有效值。有了它,您可以计算出所需的样本大小,并最终下载实际图像,但其大小最适合您的应用。

关于android - 解码bitmapfactory两次有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29942667/

相关文章:

android - 带有 Proguard 的 Ant - java.lang.NoClassDefFoundError

java - 作为任何 RX 操作符调用 java 类内部的扩展函数

android - 如何在android中将drawable设置为ListView

android - 通用图像加载器图像比例

android - 如何将自定义 View 转换为 Google map 标记图标的位图

java - 如何设置 textview 中的所有行具有相同的字符长度?

Android setHorizo​​ntalFadingEdgeEnabled 不适用于三星

android - 在android中设置图像资源

android - Firebase Crashlytics Bitmap OutOfMemoryError 哪个 Activity

android - OpenCV android中MAT的大小仍然是1920*2560*CV_8UC4