Как изменить палитру индексированного 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.

Другие вопросы по тегам