6

我在可绘制文件夹中有 270 x 2693 像素的图像。当我尝试在 imagview 中设置该图像时,我的位图太大而无法上传到纹理警告中。

图像在 android 设备 < 4.0 但不设置 > 4.0 设备中完美设置。

请帮我解决这个问题。

代码

<ImageView
   android:id="@+id/imageView"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:scaleType="fitXY"
   android:contentDescription="@string/name"
   android:src="@drawable/hindi" />

这里印地语是可绘制文件夹中的图像,其大小为 270 x 2693 像素。

4

3 回答 3

4

问题

此问题通常与 OpenGL 最大纹理大小或设备内存有关。您得到的完整错误可能类似于

W/OpenGLRenderer(12681):位图太大,无法上传到纹理中(270x2693,max=2048x2048)

内存通常是大尺寸图像的问题,但在您的情况下,270x2693 是 727110 像素。如果您在 RGBA 中,则每个像素为 4 个字节,因此 727110 * 4 = 2908440 字节,大约为 2.7 兆字节。这应该适合任何设备。

因此,您的问题可能与 OpenGL 有关。可能发生的情况是您正在测试的 Android 设备 > 4.0 检测到您的图像对于 OpenGL 来说太大并为您调整大小,而旧设备则没有。

编辑:

就我而言,问题是我的 640x1136 初始图像似乎会自动调整为 1280x2272 图像大小以适应我的设备大屏幕。这也会触发您遇到的错误消息。

如果您进一步收到此错误,则它与用于加载图像的 dpi 有关。正如您将在 Android 参考中发现的那样,设备将加载有关其 dpi 的图像,这可以改变加载到内存中的图像的大小。

解决方案

  • 除了检测设备大小以正确加载图像之外,您别无选择。

    了解如何在内存中加载大型位图

  • 您还可以为不同的设备 dpi 使用不同的图像尺寸,这可以由 Android 从 Drawable 文件夹中自动选择。

    请参阅如何支持屏幕,它会告诉您如何设置文件夹。

  • 如前所述,使用较小的图像或减小其大小。

相关信息

如果您需要支持多个屏幕,我建议您看看那里。

Android 还会收集用户每 7 天更新一次的屏幕尺寸数据。

还可以看看这个有趣的答案,它指出了一个了解内存中图像大小的好网站。

最后,如果您已经在您的应用程序中使用 OpenGL,请查看这个答案,它显示了如何检测最大 OpenGL 纹理大小

于 2013-11-01T16:12:11.287 回答
2

为什么不减小图像的大小?如果您不想这样做,那么不要在 XML 中指定位图,而是从程序代码中加载它,然后对其进行缩放以适应显示。有关加载大型位图的更多信息,请参阅本指南。

于 2013-03-01T10:16:32.460 回答
0

尝试使用此代码

int[] maxTextureSize = new int[1];
GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);

maxTextureSize 存储解码图像的大小限制,例如 4096x4096、8192x8192 。请记住在MainThread中运行这段代码,否则您将得到零。

于 2015-04-20T12:55:49.547 回答