为什么我的所有位图都被放大了200%?

6
我在我的应用程序[1]中遇到了严重的内存问题。为了调查这个问题,我在不同状态下获取了我的应用程序的堆转储。我发现一些位图占用了大量内存。我编写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),以便我可以查看位图并将它们与我在res/drawable文件夹中拥有的文件进行比较。
我发现所有的文件都被上采样了两次。
我首先检查最大的那个:堆中的字节数组缓冲区超过了9MB,解码后变成了一个漂亮的1920x1280图片,而原始文件是一个960x640的png文件。
我尝试了第二大的,超过3MB,解码后显示出一个漂亮的754x1200图片,原始大小是...猜猜看?一个漂亮的377x600的jpg文件。
怎么回事?
我已在Android清单文件中启用了硬件加速(尽管我不确定是否真的需要,我只是使用了一些基本的视图和活动)。我正在GSM Galaxy Nexus(yakju)上运行原生Android 4.0.2。尽管我还没有检查过他们的堆转储,但我的测试人员告诉我该问题存在于他们的4.0.3 Nexus S上。
我在这里试图节省内存,如果Android将每个东西都翻倍,那么应用程序很快就会崩溃,因为堆使用量太高(在我的情况下约为64MB)。我希望有一个原因和一个方法来解决它。
参考文献:
  1. 加载活动时出现OutOfMemoryError
  2. 如何实际查看从Android堆转储中获取的位图

你应该发布你的代码,以便在设置样本大小和解码图像时进行调试。这将提供更多关于此行为的信息。这可能是ICS问题。 - JoxTraex
我只是正在膨胀几个ImageView。如果需要查看代码,请查看链接[1],所有内容都在那里。 - Benoit Duffez
1个回答

7
当您将图像放置在“res / drawable”中时,Android将假定它们具有160dpi,即与将它们放置在“res / drawable-mdpi”中相同。Galaxy Nexus是一个xhdpi设备,即它具有320dpi(广义)。为了弥补高分辨率显示的影响,Android将对图像进行200%的上采样。
解决方案很简单,只需将图像放入“res / drawable-xhdpi”中即可。然后,图像的声明dpi将与您运行的显示器匹配,Android将不会对图像执行任何缩放。
请参阅http://developer.android.com/guide/practices/screens_support.html了解更多信息。

好的,我明白了。问题在于我正在开发的应用程序包含数百张图片,客户不会喜欢我告诉他需要在另一个分辨率下重新制作所有这些图片。我会找到一种简单的方法,非常感谢您的帮助!将大图片移动到drawable-xhdpi中解决了所有内存问题,现在我的应用大小不到40MB,而之前超过了60MB。谢谢。 - Benoit Duffez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接