在Android培训文档中,有一篇关于有效加载大型位图的文章,其中讨论了在加载图像时计算
我不是很明白这里使用的
我想将用户的照片加载到OpenGL纹理中。我已经查询了
我调用了文档中提供的静态帮助方法:
逐步执行此代码时,`halfHeight` 将为 1216,`halfWidth` 将为 2160,只有当该值除以 `inSampleSize` 仍大于所请求的尺寸时,`inSampleSize` 才会不为 1。
运行此设置时,`inSampleSize` 被设置为 1,这根本不会缩小图像,并且 OpenGL 抛出了异常,因为它比 `GL_MAX_TEXTURE_SIZE` 还要大。
我的问题是,为什么我们要在这里除以2?我不关心我的图像是否适合所请求的尺寸的一半,我想要整个图像适合。保持增加 `inSampleSize` 直到 `(halfHeight / inSampleSize) > reqHeight` 和 `(halfWidth / inSampleSize) > reqWidth` 不再成立,难道不更有意义吗?
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` 还要大。
我的问题是,为什么我们要在这里除以2?我不关心我的图像是否适合所请求的尺寸的一半,我想要整个图像适合。保持增加 `inSampleSize` 直到 `(halfHeight / inSampleSize) > reqHeight` 和 `(halfWidth / inSampleSize) > reqWidth` 不再成立,难道不更有意义吗?