ICS上的位图加载了错误的像素格式

时间:2012-02-01 14:50:38

标签: android drawable android-4.0-ice-cream-sandwich

我遇到了以下问题。当在Ice Cream Sandwich上运行的应用程序从资源加载任何位图时,它可能会被错误地渲染,好像它已被解码为与当前窗口格式不同的格式,没有应用抖动。但是,解码格式和窗口格式都已明确设置:

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.RGBA_8888;

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

以下是使用ICS 4.0.3在模拟器上运行的test app获取的this article的屏幕截图(它在HTC HD2上提供了相同的结果):

RGBA_8888(32位)窗口格式,各种位图解码格式: 32-bit window format

RGB_565(16位)窗口格式,各种位图解码格式: 16-bit window format

可以注意到几件事:

  • 不时不考虑抖动标志;
  • ICS的默认窗口格式似乎是RGB_565;
  • 唯一看上去好看的渐变会显示RGB_565 窗口格式RGBA_8888 位图解码格式

在这些问题中也报告了这个问题,但仍无法找到解决方案:

Gradient compatibility issue - ICS defaults to fewer colors than all the previous versions of Android

Awful background image quality in Android

问题是,如何在ICS上处理所有这些格式,更准确地说,如何使用RGBA_8888格式加载ICS加载位图以及如何将窗口格式设置为RGBA_8888以便这些位图是否正确显示?

2 个答案:

答案 0 :(得分:6)

我绝对可以向您保证默认窗口格式为RGB888。这实际上是Android 2.3中的默认设置,并且自从它们没有更改。此时我会考虑弃用RGB565窗口,因为基本上所有当前设备都有32bpp显示器。

你说你也在HTC HD2上运行它,但由于没有官方版本,我会怀疑你到达那里的任何结果。

我认为模拟器仍然可以使用16bpp显示器,所以在这个区域我不会依赖它的结果来完全匹配你通常会在设备上看到的结果。

答案 1 :(得分:0)

该演示应用程序有点奇怪......它有两个活动,它们都过滤启动器意图,一个用于16bpp,一个用于32bpp。我不确定在您启动应用程序时是什么决定了哪一个被选中。

在ICS设备(Nexus S运行库存4.0.3)上按原样运行应用程序会导致始终选择16bpp版本。如果从清单中删除16bpp活动声明,则不出所料地启动32bpp版本。这对我来说很好看。 “抖动”选项在32bpp中没有效果,但这正如预期的那样......当显示表面深度低于图像深度时,抖动才会发挥作用。

至于显示器表面深度,我的理解是窗口表面深度默认为16bpp,直到Android 3.0(Honeycomb),此时默认情况下悄然切换到32bpp。默认值始终可以通过Window.setFormat()覆盖。