Как изменить палитру индексированного PNG во время выполнения на iOS?
У меня есть серия изображений PNG, которые используют индексы в цветовой палитре (цвет PNG 3). В некоторых случаях мне нужно сделать копию изображения, где некоторые записи в палитре изменены. Таким образом, мы перекрашиваем исходный PNG снова и снова.
В Java это выполняется путем получения значений RGB из IndexedColorModel
, изменение значений и создание нового IndexedColorModel
и создание нового BufferedImage
с растровыми данными исходного изображения и новой цветовой моделью.
В Actionscript я должен был читать в байтах PNG как голые ByteArray
найдите блок палитры, измените значения, затем загрузите изображение во время выполнения ByteArray
,
Сейчас я пытаюсь реализовать ту же систему для iOS через MonoTouch (что я новичок), но я попал в стену. Я полагаю, что подход Actionscript также сработает и здесь, но было бы неплохо на этот раз не работать на таком низком уровне, и, похоже, я могу приблизиться.
Если я начинаю с UIImage
Я могу получить цветовое пространство с UIImage.CGImage.ColorSpace
, Я могу убедиться, что это индексированная цветовая модель с colorSpace.Model
, То, в чем я не уверен, так это то, как я получаю фактический массив байтов палитры.
А с другой стороны, как мне создать новое изображение с новой палитрой? CGImage.WithColorSpace
похоже, это будет делать то, что я хочу... может быть? И тогда я должен быть в состоянии создать цветовое пространство с моей новой палитрой: На поверхности, CGColorSpace.CreateIndexed
выглядит как то, что я хочу, но мне неясно, как baseSpace
параметр используется. Я хочу создать CGColorSpace
с совершенно новой цветовой палитрой, которую я предоставляю, а затем использую индексы исходного изображения с новой палитрой. Может быть, я неправильно понимаю, что именно CGColorSpace
используется для.
1 ответ
В Actionscript мне приходилось читать байты PNG как пустой ByteArray, находить блок палитры, изменять значения, а затем иметь во время выполнения загрузку изображения из ByteArray.
Это немного грубо, но это сработает. Однако я уверен, что в CoreGraphics есть все необходимое, чтобы этого избежать.
Если я начинаю с UIImage
Поскольку вы все равно будете использовать CoreGraphics (CG), вы можете начать с CGImage
, Пример кода (objc) здесь: iPhone SDK: доступ к индексированным цветным изображениям PNG
То, в чем я не уверен, так это то, как я получаю фактический массив байтов палитры.
CGColorSpaceGetColorTable
выглядит как идеальный кандидат. Однако, похоже, что он отсутствует в привязках MonoTouch (я проверю это), но было бы легко (это ap / invoke) связать вручную и использовать в вашем приложении.
но мне неясно, как используется параметр baseSpace
CGColorSpace.CreateIndexed
может принять null
параметр для baseSpace
но вам может быть лучше скопировать тот же базовый GCColorSpace из исходного изображения PNG.