在imageview中加载大尺寸图像问题.位图太大,无法上传到纹理中



在可绘制文件夹中有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像素。

问题

这个问题通常与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纹理大小

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

尝试使用此代码

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

maxTextureSize存储解码图像的大小限制,如4096x4096, 8192x8192。记住要在主线程中运行这段代码,否则您将得到0。

最新更新