为啥我的所有位图都被上采样了 200%?

Posted

技术标签:

【中文标题】为啥我的所有位图都被上采样了 200%?【英文标题】:Why are all my bitmaps upsampled 200%?为什么我的所有位图都被上采样了 200%? 【发布时间】:2012-03-26 10:39:45 【问题描述】:

我的应用程序 [1] 存在严重的内存问题。为了对此进行调查,我在不同的州对我的应用进行了堆转储。我看到一些位图占用了大量内存。我编写了一个小工具 [2],将字节数组解码为 Windows 位图文件 (.bmp),以便我可以查看位图并将它们与我在 res/drawable 文件夹中的文件进行比较.

我发现我的所有文件都被上采样了两次。 我首先检查了最大的一个:堆中超过 9MB 的字节数组缓冲区,它被解码为漂亮的 1920x1280 图片,而原始图片是 960x640 png 文件。 我尝试了第二大,超过 3MB,解码后显示了一张漂亮的 754x1200 图片,原始大小是......你猜怎么着?一个不错的 377x600 jpg 文件。

什么给了?

我在我的 android Manifest 文件中启用了硬件加速(虽然我不确定我是否真的需要它,我只是在使用一些基本的视图和活动)。 我在 GSM Galaxy Nexus (yakju) 上运行 Android 4.0.2。我收到测试人员的反馈,他们的 4.0.3 Nexus S 存在问题,但我还无法检查他们的堆转储。

我在这里尝试节省内存,如果 Android 将所有内容翻倍,难怪应用程序会因为堆使用率过高(在我的情况下约为 64MB)而迅速崩溃。我希望有一个原因和解决方法。

参考资料:

    OutOfMemoryError when loading activities How to actually see a Bitmap taken from an Android heap dump

【问题讨论】:

您应该在设置样本大小和解码图像时发布您的代码。这应该提供有关此行为的更多信息。这可能是 ICS 问题。 我只是在膨胀几个 ImageView。如果您需要查看一些代码,请检查链接 [1],一切都在那里。 【参考方案1】:

当您将图像放入res/drawable 时,Android 将假定它们的 dpi 为 160,即与将它们放入 res/drawable-mdpi 相同。 Galaxy Nexus 是 xhdpi 设备,即它的(通用)dpi 为 320。为了补偿高分辨率显示,Android 将对图像进行 200% 的上采样。

解决方法很简单,只需将图片放在res/drawable-xhdpi 中即可。然后图像的声明 dpi 将与您运行的显示器匹配,Android 不会对图像执行任何缩放。

更多信息请参考http://developer.android.com/guide/practices/screens_support.html

【讨论】:

好的,我明白了。问题是我正在开发的应用程序包含数百张图片,当我说他需要以另一种分辨率完成所有这些图片时,客户不会喜欢。我会找到一个简单的方法,但非常感谢你帮助我!将大图片移动到 drawable-xhdpi 消除了所有内存问题,我低于 40MB,而在此之前我超过 60MB。谢谢。

以上是关于为啥我的所有位图都被上采样了 200%?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?

当我尝试更改采样率时,为啥 sox 会损坏我的 wav 文件?

采样时间 (ms) 与 Loadrunner 对同一请求的响应时间不同。为啥会这样?

将相机图像作为位图 Android 示例

fpga的ila的采样深度为啥选择不到设置的最大值

使用纹理数组时,为啥我不必将采样器绑定到着色器?