У меня есть серия изображений 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
.
p.s. если вы можете заполнить отчет об ошибке на http://bugzilla.xamarin.com foir отсутствующим «CGColorSpaceGetColorTable» и прикрепить индексированный PNG, я добавлю его в следующую (стабильную) версию MonoTouch. Объявление p/invoke закончится в репозитории (public) maccore github (так что вы сможете его скопировать/вставить). Благодаря! – poupou
Ага, отсутствует метод. Сегодня я отправлю отчет об ошибке. Кроме того, я не упоминал об этом, потому что я не был уверен, что это будет уместно, но я действительно работаю с * дополнительным слоем: мой источник на самом деле находится на Java, преобразован в DLL через IKVM. Я еще не знаю, как выполнить ручное связывание, а затем, если я смогу получить к нему доступ через IKVM, но сейчас я пойду в этом направлении. Благодаря! – roguenet
Ошибка, отправленная с прикрепленным примером изображения: https://bugzilla.xamarin.com/show_bug.cgi?id=4573. Надеюсь, у меня будет время выкопать ручную привязку сегодня, после этого сообщит об успехе. – roguenet