如何将32位PNG转换为RGB565?

时间:2012-04-12 06:19:33

标签: objective-c macos cocos2d-iphone compression png

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

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

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

5 个答案:

答案 0 :(得分:4)

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

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

你可以通过舍入而不是斩波来改善这一点,小心不要溢出值。当原始8位值中的绿色值全部相等时,您也可以强制绿色值等于蓝色和红色值。否则,转换后可能会使原本灰色的颜色无意中呈现颜色。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

一个简单的例子:原文:

enter image description here

在使用XnView

应用32级(相当于RGB555)的简单海报之后

enter image description here

大小从89KB到47KB,质量损失很小。 对于具有渐变的合成图像,质量损失可能更加明显(条带化)。

答案 3 :(得分: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.

答案 4 :(得分:0)

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

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

[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565];