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

12
我遇到了以下问题。在运行在冰淇淋三明治系统上的应用程序加载任何位图资源时,它很可能会以不正确的方式呈现,就好像已将其解码为与当前窗口格式不同但未应用抖动的格式。然而,解码格式和窗口格式都已被明确设置:
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模拟器(在HTC HD2上也会得到相同的结果)拍摄的测试应用程序的屏幕截图:

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

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

可以注意到几件事情:

  • 有时候会忽略抖动标志;
  • 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上的所有这些格式,更精确地说,如何使ICS加载具有RGBA_8888格式的位图,并将窗口格式设置为RGBA_8888,以便这些位图可以正确显示?


在这些条件下,模拟器和设备之间有区别吗? - Fred Grott
不,它们表现出相同的行为。 - a.ch.
2个回答

7
我可以肯定地告诉你,默认的窗口格式是RGB888。这实际上是在Android 2.3中成为默认设置,并且自那以后就没有改变。目前,我认为RGB565窗口已经过时了,因为基本上所有当前设备都具有32bpp显示器。
你说你也在HTC HD2上运行它,但由于没有官方版本可用,因此我会对你在那里得到的任何结果持怀疑态度。
我认为模拟器可能仍然使用16bpp显示器,在这个领域,我不会指望它的结果与你通常在设备上看到的完全匹配。

是的,已经下载了BitmapConfig.apk测试应用程序 - 在“适当”的ICS版本上,RGB888和抖动效果都很好。 - Jens

0

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

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

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


在模拟器/设备的应用程序菜单中按下的图标决定启动哪个活动:该菜单中出现了两个应用程序图标,BitmapConfig和BitmapConfig32。因此,这个演示应用程序一切正常,并且它给出了与屏幕截图完全相同的结果:setFormat(..)没有发挥作用。 - a.ch.
当然。我太习惯从Eclipse运行了,它可能会选择在清单中声明的第一个处理启动器活动。 - Reuben Scratton

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