繁体   English   中英

如何在不设置OpenGL上下文的情况下可靠地确定ImageView可显示的最大图像大小?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM