У меня есть серия изображений 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
.