Что умеет менять палитру (colourmap) в рисунках с индексированными цветами? Стоят 2 задачи:
1. Выдать в понятном текстовом виде таблицу «Номер — уровни R, G, B и альфа» для палитры 8-битного PNG.
2. Взять 8-битный PNG с произвольной палитрой и преобразовать в 8-битный PNG в котором цвета в палитре находятся в заданном «эталонном» порядке. Известно, что в эталонной палитре все цвета исходного файла присутствуют.
Чем это можно сделать?
GIMP, как выяснилось, глючит и теряет цвета.
Krita не умеет работать с индексированными цветами.
То, что NetPBM называет «палитрой», оказалось списком используемых в данном файле цветов в произвольном порядке.
Аналогично с выдачей identify -verbose из пакета ImageMagic, но я ещё не закончил изучать доки.
Про GraphicMagic утверждают, что он тасует цвета в случайном порядке. До него я тоже ещё не добрался.
В XV, XPaint, Tuxpaint, Pinta, MyPaint ничего похожего на загрузку произвольной палитры я не нашёл. Плохо искал?
P.S. MyPaint вдобавок при экспорте обрезает пустое пространство с нижнего краю.
Подытог:
Обходной путь:
- загрузить файл в GIMP,
- экспортировать палитру (например, в GPL),
- руками добавить в неё правильный нулевой цвет,
- импортировать палитру,
- применить её к испорченному рисунку,
- экспортировать в PNG.
Если стартовый файл без повреждений, ничего не теряется.
Дополнение: В документации на библиотеку Питона Pillow (бывшая PIL) описывается функция Image.remap_palette(), которая именно так заменяет индексы в палитре: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.... Если так, то программа запишется строк в 6.
Дополнение 2: Можно восстановить потерявшую 1 цвет палитру средствами самого Гимпа. В редакторе палитры добавить в конец 256-й цвет, сохранить, затем в списке палитр сделать из контекстного меню «Offset Palette» на 1. Но делать так при каждом открытии 8-битного PNG с альфа-каналом неприемлемо трудоёмко.