2

我怎样才能做到这一点?程序化解决方案(Objective-c)很棒,但即使是非程序化解决方案也很好。

我有 pixelmator -> 但这并没有给你选择。我似乎也无法使用预览来做到这一点。

我试过谷歌搜索,但到目前为止还没有找到解决方案。我能够使用的唯一工具是 TexturePacker,但它会创建一个精灵表。

4

5 回答 5

6

您可以使用libpng将 PNG 图像转换为三字节 (8:8:8) RGB。然后可以下采样到 RGB565 的 5:6:5 16 位颜色值。如果rgb是各自的 8 位颜色(以无符号字符类型存储),则 16 位 RGB565 值为:

((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)

您可以通过舍入而不是切碎来改进这一点,注意不要溢出值。当它们在原始 8 位值中都相等时,您还可以强制绿色值等于蓝色和红色值。否则,可能会使原本为灰色的颜色在转换后无意中呈现颜色。

于 2012-04-12T14:58:51.340 回答
2

使用 Quartz 创建颜色为 RGB565 的位图上下文,在此上下文上绘制您的 PNG,将此位图上下文保存到文件中。

于 2012-04-13T04:18:13.350 回答
2

PNG 不支持 RGB565 打包。您始终可以对图像应用后处理(以编程方式或使用ImageMagick或任何图像编辑器),这相当于丢弃每个通道中的较低有效位。保存为 PNG 时,您仍将为每个通道节省 8 位(除非您使用调色板),但即便如此,由于 PNG 压缩,您仍会获得明显的尺寸减小。

一个简单的例子:原始:

在此处输入图像描述

在使用 XnView 应用具有 32 个级别(相当于 RGB555)的简单分色后

在此处输入图像描述

大小从 89KB 到 47KB,质量损失很小。在具有梯度的合成图像的情况下,质量损失可能更加明显(条带)。

于 2012-04-13T17:20:33.273 回答
2

我从纹理打包器的创建者那里收到了这个答案:

you can do it from command line - see

http://www.texturepacker.com/uncategorized/batch-converting-images-to-pvr-or-pvr-ccz/

Just adjust the opt and set output to .png instead of pvr.ccz
Make sure that you do not overwrite your source images.
于 2012-04-14T08:38:17.963 回答
0

根据总是正确的维基百科,唯一的 16 位 PNG 是灰度 PNG。 http://en.wikipedia.org/wiki/Portable_Network_Graphics

如果您只是像往常一样将 32 位(alpha)或 24 位(无 alpha)PNG 添加到您的项目中,然后在 Cocos2D 中设置纹理格式,一切都应该没问题。代码是:

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565];
于 2012-04-12T15:47:18.310 回答