在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;
}
对我而言,没有什么意义是在这里使用
halfHeight
和halfWidth
。让我们来看一个真实的例子,以便我能说明我的意思。我想将用户的照片加载到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/