2012-04-19 7 views
1

У меня есть серия изображений PNG, которые используют индексы в палитре для цвета (цвет PNG типа 3). В некоторых случаях мне нужно сделать копию изображения, где некоторые элементы в палитре изменены. Таким образом, мы повторно используем исходный PNG снова и снова.Как изменить палитру индексированного PNG во время выполнения на iOS?

В Java, это обрабатывается путем получения значения RGB из IndexedColorModel, изменяя значения и создания нового IndexedColorModel, и создание нового BufferedImage с растровыми данными исходного изображения в и новую цветовую модель.

В Actioncript мне пришлось читать в байтах PNG как голый ByteArray, найти палитру палитры, изменить значения, а затем загружать изображение из ByteArray.

Я сейчас ищу для реализации той же системы для iOS через MonoTouch (что я новичок), но я ударил стену. Я считаю, что подход ActionScript также будет работать здесь, но было бы неплохо избежать работы на таком низком уровне на этот раз, и похоже, что я могу приблизиться.

Если я начинаю с UIImage, я могу получить цветовое пространство с UIImage.CGImage.ColorSpace. Я могу проверить, что это индексированная цветовая модель с colorSpace.Model. Я не уверен, что я получаю фактический массив палитр палитры.

А затем на другой стороне, как мне создать новое изображение с новой палитрой? CGImage.WithColorSpace похоже, что это будет делать то, что я хочу ... может быть? И тогда я должен иметь возможность создать цветовое пространство с моей новой палитрой: на поверхности CGColorSpace.CreateIndexed выглядит так, как я хочу, но я не знаю, как использовать параметр baseSpace. Я хочу создать CGColorSpace с полностью новой цветовой палитрой, которую я предоставляю, а затем использовать индексы исходного изображения с новой палитрой. Возможно, я неправильно понимаю, для чего используется CGColorSpace.

ответ

1

В Actioncript мне пришлось читать в байтах PNG в виде голого ByteArray, находить палитру палитры, изменять значения, а затем загружать изображение из ByteArray.

Это немного грубо, но это сработает. Однако я уверен, что у CoreGraphics есть все необходимое, чтобы этого избежать.

Если я начинаю с UIImage

Поскольку вы будете использовать CoreGraphics (CG) в любом случае вы можете начать с CGImage. Пример кода (objc) здесь: iPhone SDK: accessing indexed color PNG images

Что я не уверен в том, как получить фактический массив палитр палитры.

CGColorSpaceGetColorTable выглядит как идеальный кандидат. Однако похоже, что он отсутствует в привязках MonoTouch (я проверю это), но было бы легко (это p/invoke) связать вручную и использовать в вашем приложении.

но я неясно о том, как параметр baseSpace используется

CGColorSpace.CreateIndexed может принимать параметр null для baseSpace, но вы могли бы быть лучше, копируя же, основание, GCColorSpace из исходного PNG изображения.

+0

p.s. если вы можете заполнить отчет об ошибке на http://bugzilla.xamarin.com foir отсутствующим «CGColorSpaceGetColorTable» и прикрепить индексированный PNG, я добавлю его в следующую (стабильную) версию MonoTouch. Объявление p/invoke закончится в репозитории (public) maccore github (так что вы сможете его скопировать/вставить). Благодаря! – poupou

+0

Ага, отсутствует метод. Сегодня я отправлю отчет об ошибке. Кроме того, я не упоминал об этом, потому что я не был уверен, что это будет уместно, но я действительно работаю с * дополнительным слоем: мой источник на самом деле находится на Java, преобразован в DLL через IKVM. Я еще не знаю, как выполнить ручное связывание, а затем, если я смогу получить к нему доступ через IKVM, но сейчас я пойду в этом направлении. Благодаря! – roguenet

+0

Ошибка, отправленная с прикрепленным примером изображения: https://bugzilla.xamarin.com/show_bug.cgi?id=4573. Надеюсь, у меня будет время выкопать ручную привязку сегодня, после этого сообщит об успехе. – roguenet

 Смежные вопросы

  • Нет связанных вопросов^_^