[英]How to reliably determine the maximum image size displayable by ImageView without setting up an OpenGL context?
我的应用程序显示从相机拍摄的照片。 在某些设备上,由于以下错误消息,导致图片未显示在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像素宽 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.