如何在iOS上运行时修改索引PNG的调色板?

如何在iOS上运行时修改索引PNG的调色板?,ios,xamarin.ios,png,core-graphics,cgcolorspace,Ios,Xamarin.ios,Png,Core Graphics,Cgcolorspace,我有一系列PNG图像,它们将索引用于调色板颜色(PNG颜色类型3)。在某些情况下,我需要制作一个图像的副本,其中调色板中的一些条目被修改。通过这种方式,我们一次又一次地重新获取源PNG 在Java中,这是通过从IndexedColorModel获取RGB值、修改值并创建新的IndexedColorModel、使用源图像的光栅数据和新的颜色模型创建新的BuffereImage来处理的 在Actionscript中,我必须将PNG字节作为裸ByteArray读取,找到调色板块,修改值,然后让运行时从

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

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

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

我现在希望通过MonoTouch(我是新手)为iOS实现同样的系统,但我遇到了麻烦。我相信Actionscript方法在这里也会起作用,但是这次避免在这么低的级别上工作会很好,而且看起来我可以接近

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

另一方面,我如何用新的调色板创建新的图像
CGImage.WithColorSpace
看起来可以满足我的要求。。。大概然后我必须能够用我的新调色板创建一个颜色空间:在表面上,
CGColorSpace.CreateIndexed
看起来像我想要的,但我不清楚如何使用
baseSpace
参数。我想用我提供的全新调色板创建一个
CGColorSpace
,然后用新调色板使用原始图像的索引。也许我完全误解了
CGColorSpace
的用途

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

这有点残忍,但会奏效。不过,我很确定CoreGraphics拥有避免这种情况的一切

如果我是从UIImage开始的

由于您将使用CoreGraphics(CG),因此可以从
CGImage
开始。此处的示例代码(objc):

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

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

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

可以接受
baseSpace
null
参数,但最好从原始PNG图像复制相同的、基本的GCColorSpace

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

这有点残忍,但会奏效。不过,我很确定CoreGraphics拥有避免这种情况的一切

如果我是从UIImage开始的

由于您将使用CoreGraphics(CG),因此可以从
CGImage
开始。此处的示例代码(objc):

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

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

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


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

p.s.如果您可以在缺少的
CGColorSpaceGetColorTable
上填写错误报告并附加索引PNG,我会将其添加到下一个(稳定的)MonoTouch版本中。p/invoke声明将在github的(公共)maccore存储库中结束(因此您可以从那里复制/粘贴它)。谢谢啊哈,一个缺失的方法。今天我将提交一份bug报告。此外,我没有提到这一点,因为我不确定它是否相关,但我实际上正在使用另一层:我的源代码实际上是Java,通过IKVM转换为DLL。我不知道(现在)如何进行手动绑定,然后我是否能够通过IKVM访问它,但我现在将朝这个方向进行研究。谢谢随附示例图像一起提交的错误:。希望我今天有时间深入研究手工装订,届时我会汇报成功的情况。谢谢!这将是一个更好的测试用例:-)声明可以从中看到,但您可能需要更多的C#来通过IKVM。我还没有机会使用它,与其尝试通过IKVM访问手动绑定,不如等待下一个MonoTouch版本:)。谢谢你的帮助!p、 如果你能在缺少的
cgcolorspace getcolortable
上填写一份bug报告,并附加一个索引PNG,我会将其添加到下一个(稳定的)MonoTouch版本中。p/invoke声明将在github的(公共)maccore存储库中结束(因此您可以从那里复制/粘贴它)。谢谢啊哈,一个缺失的方法。今天我将提交一份bug报告。此外,我没有提到这一点,因为我不确定它是否相关,但我实际上正在使用另一层:我的源代码实际上是Java,通过IKVM转换为DLL。我不知道(现在)如何进行手动绑定,然后我是否能够通过IKVM访问它,但我现在将朝这个方向进行研究。谢谢随附示例图像一起提交的错误:。希望我有时间深入研究手工绑定toda