2010-08-21 43 views
3

我正确地说16位图像将被解码并绘制得比24位或32位更快?我知道文件大小会更少,但如果位图实际绘制速度比转换它们的速度更快。如果速度更快,我将如何去保存16位jpeg文件?我只在Photoshop中找到一个选项来保存一个16位的位图...这是54 MB。16位图像和Android处理

回答

3

这取决于。如果你的屏幕(以及绘制到它的表面)是16位,它可以更快;如果它们是32位,则32位位图可能会更快。

但是,如果您在资源方面(这意味着JPEG或PNG图像),说他们是“16位”或“32位”是没有意义的。 JPEG是一种颜色表示,通常会扩展为32位,但您也可以将其解压缩到16位(并且可能希望在抖动时进行抖动,以使其看起来不错)。 PNG可以存储很多表示,具体取决于图像,并且通常会选择最好的。此外,在包装过程中,aapt会遍历所有PNG图像,并将其重新压缩为尽可能小的最终图像,因此如果可能的话,甚至可以使用调色板表示。

因此,如何存储图像并不重要;重要的是在运行时解压缩时创建的位图。这里有一些一般的规则:

  • 如果图像有alpha,它将需要解压缩到完整的32位。
  • 如果帧缓冲区和曲面是32位,应该将图像解压缩到32位。
  • 如果图像没有alpha,它可能是888(32位)或565(16位)。挑选使用的是...很棘手。

从历史上看,我们在平台上使用的设备有16位屏幕,所以我们必须处理它的复杂性。主要问题是平衡内存使用与渲染性能与质量之间的平衡。对于内存使用和渲染性能来说,16位是最好的...但是,对于许多图像来说,如果图像没有抖动,将会出现色带。

在哪里做抖动也很棘手:理想情况下,你会做它的一部分,生成原始图像,但这限制了你可以用它做什么(没有缩放,这意味着不使用9补丁)。另一方面,渲染时可以做到这一点,但这意味着您需要将图像加载为32位,并在每次将图像拖入屏幕时抖动。这提供了最大的灵活性,但具有更多的内存和性能影响。

现在在实践中,这实际上最终成为平台的一个罕见问题 - 因为几乎所有用作9补丁或其他类似图像的图像都具有透明度,因此无论如何都需要将其加载为32位,因此它渲染时不会太大。

这一切都归结做的是:

  • 如果图像的透明度,不用担心,它无论如何都会被载入32位。
  • 如果您的图像没有透明度,你将需要:
    • 决定是否抖动原始图像。这将在16位屏幕上提供更好的质量(您会比关键性能渲染代码更好地抖动),但不会充分利用32位屏幕。
    • 让平台决定要做什么。这将给16位和32位屏幕带来好的结果,但您不想缩放图像。
    • 自己加载图像,并明确控制API以决定使用何种格式以及何时(或如果)抖动。
+0

很好的答案,谢谢。 – jfisk 2010-08-22 06:05:43

0

我希望你的意思是16位,RGB 565格式,是的,它应该比24位RGB 888或32位RGB 8888格式更快。您在photoshop中看到的内容可能与RGB 565不同,但是每个组件16位的RGB,使每像素8位RGB增加一倍。

AFAIK JPEG不支持16位格式(每个像素为565或16位)。