我的应用程序显示从相机拍摄的照片。在某些设备上,由于错误消息,图片不会显示在 ImageView 上:Bitmap too large to be uploaded into a texture (1624x2251, max=2048x2048)
为了解决此问题,该应用程序只需将图像缩小到支持的最大纹理大小。代码如下所示:
int[] maxTextureSize = new int[1];
GLES10.glGetIntegerv(GLES10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
if (maxTextureSize[0] < 2048) {
maxTextureSize[0] = 2048;
}
if (bitmap.getWidth() > maxTextureSize[0] || bitmap.getHeight() > maxTextureSize[0]) {
float factor = Math.min((float)maxTextureSize[0] / (float)bitmap.getWidth(), (float)maxTextureSize[0] / (float)bitmap.getHeight());
int newWidth = (int) (bitmap.getWidth() * factor);
int newHeight = (int) (bitmap.getHeight() * factor);
bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, false);
}
现在,这在大多数情况下都有效,除了不时(随机(时,当GLES10.glGetIntegerv(GLES10.GL_MAX_TEXTURE_SIZE)
导致以下错误消息而不返回纹理大小时:
call to OpenGL ES API with no current context (logged once per thread)
现在的问题是,应用如何可靠地确定 ImageView 的最大可显示位图大小?最好不要设置 OpenGL 上下文。还有其他选择吗?
看看有效地显示位图。这是一个非常深入的官方指南,可以解决您面临的确切问题。
从堆栈溢出的这个答案中,您可以使用:
MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
//Percentage can be calculated for API 16+
long percentAvail = mi.availMem / mi.totalMem;
以获取可用于应用的内存。 使用此位图和位图的大小,您可以准确确定图像的大小。
该应用程序只需将图像缩小到支持的最大纹理大小
我必须说,您可能正在尝试渲染比可以显示的图像更大的图像。在渲染位图之前,您是否考虑了设备的分辨率?没有很多设备是 2048 像素宽。