1

我有一系列 PNG 图像,它们使用颜色调色板中的索引(PNG 颜色类型 3)。在某些情况下,我需要制作一个图像副本,其中修改了调色板中的某些条目。通过这种方式,我们一遍又一遍地重新着色源 PNG。

在 Java 中,这是通过从 中获取 RGB 值IndexedColorModel、修改值并创建一个新的IndexedColorModel,并BufferedImage使用源图像的光栅数据和新的颜色模型创建一个新的来处理的。

在 Actionscript 中,我必须读取 PNG 字节作为裸ByteArray.,找到调色板块,修改值,然后让运行时从ByteArray.

我现在希望通过 MonoTouch(我是新手)为 iOS 实现相同的系统,但我碰壁了。我相信 Actionscript 方法也可以在这里工作,但这次最好避免在如此低的级别上工作,而且看起来我可以接近。

如果我从 a 开始UIImage,我可以使用UIImage.CGImage.ColorSpace. 我可以验证它是一个带有索引的颜色模型colorSpace.Model。我不确定的是如何获得调色板字节的实际数组。

然后另一方面,如何使用新调色板创建新图像?CGImage.WithColorSpace看起来它会做我想要的......也许?然后我必须能够用我的新调色板创建一个色彩空间:表面上CGColorSpace.CreateIndexed看起来像我想要的,但我不清楚baseSpace参数是如何使用的。我想CGColorSpace用我提供的全新调色板创建一个,然后将原始图像的索引与新调色板一起使用。也许我误解了确切CGColorSpace的用途。

4

1 回答 1

1

在 Actionscript 中,我必须将 PNG 字节作为裸 ByteArray 读取,找到调色板块,修改值,然后让运行时从 ByteArray 加载图像。

这有点粗鲁,但它会工作。但是,我很确定 CoreGraphics 拥有避免这种情况所需的一切。

如果我从 UIImage 开始

由于无论如何您都将使用 CoreGraphics (CG),因此您可以从CGImage. 此处的示例代码 (objc):iPhone SDK:访问索引颜色 PNG 图像

我不确定的是如何获得调色板字节的实际数组。

CGColorSpaceGetColorTable看起来是完美的候选人。然而,MonoTouch 绑定似乎缺少它(我会检查一下),但手动绑定并在您的应用程序中使用会很容易(它是 ap/invoke)。

但我不清楚如何使用 baseSpace 参数

CGColorSpace.CreateIndexed可以接受null参数,baseSpace但您最好从原始 PNG 图像中复制相同的基本 GCColorSpace。

于 2012-04-19T13:25:30.633 回答