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



我的应用程序显示从相机拍摄的照片。在某些设备上,由于错误消息,图片不会显示在 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 像素

最新更新