在Android培训文档中,有关如何有效加载大型位图的article讨论了如何计算inSampleSize以在加载图像时对图像进行降采样。这是共享的代码示例。

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

对我而言,没有什么意义是在这里使用halfHeighthalfWidth。让我们来看一个真实的例子,以便我能说明我的意思。

我想将用户的照片加载到OpenGL纹理中。我已经查询过GL_MAX_TEXTURE_SIZE为4096。用户选择的照片为4320x2432,因此我需要将其缩小一点。

我对文档中提供的我的静态助手方法进行了调用:
options.inSampleSize = BitmapUtils.calculateInSampleSize(options, maxTextureSize, maxTextureSize);

逐步执行此代码,halfHeight将为1216,halfWidth将为2160,并且仅当该值除以inSampleSize所得的值仍大于请求的尺寸时,inSampleSize才会为1以外的值。

当我运行此设置时,inSampleSize设置为1,这根本不会缩小图像,并且OpenGL会抛出拟合,因为它大于GL_MAX_TEXTURE_SIZE

我的问题是为什么我们在这里一分为二?我不在乎我的图像的一半是否适合要求的尺寸,我希望整个图像都适合。只要inSampleSize(halfHeight / inSampleSize) > reqHeight保持颠簸(halfWidth / inSampleSize) > reqWidth有意义吗?

最佳答案

这是我对这种方法的 Intent 的误解。我以为我们正在寻找一个inSampleSize,它将解码一个位图以使其在内适合所要求的尺寸。现在,我看到该方法旨在返回一个值以解码位图,该位图应尽可能接近,但不小于请求的大小。

关于android - 为什么文档样本被2除以计算inSampleSize来加载位图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23087127/

10-10 23:02