如何在iOS上运行时修改索引PNG的调色板?
我有一系列PNG图像,它们将索引用于调色板颜色(PNG颜色类型3)。在某些情况下,我需要制作一个图像的副本,其中调色板中的一些条目被修改。通过这种方式,我们一次又一次地重新获取源PNG 在Java中,这是通过从如何在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读取,找到调色板块,修改值,然后让运行时从
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