В том-то и прикол, что никто писать не хочет
Обычно сами пишут и не выкладывают, потому что иногда нужно специфичное и нет смысла делать публичную протестированную версию.
Даже в такой простой программе есть нюансы.
Приводить цвета можно по-разному.
Здесь для 24 ->15 для компоненты цвета используется формула:
min((c + 7) / 8, 31)
Но можно так:
c / 8
Для 15 -> 25 здесь:
c * 8
Но можно яркий вариант:
c * 255 / 31 # Целые числа, с округлением вниз
round(c * 255.0 / 31.0) # Вещественные, с округлением до ближайшего (зависит от round)
Формат ACT от Photoshop описан (
https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577411_pgfId-1070626) так:
Размер файла 768 или 772 байт и содержит 256 RGB цветов. Первый цвет - индекс 0. Байты идут красный, зелёный, синий. Если размер файла 772 байт, то 4 доп. байта: 2 байта - количество используемых цветов (Big-Endian, 01 00 - 256 цветов), 2 байта - индекс прозрачного цвета (Big-Endian, 00 FF - 255 (последний) цвет). Там не написано, но сам Photoshop ставит прозрачный цвет в FF FF, если не используется.
При чтении файла .act можно учитывать указанное количество цветов, чтобы вручную не обрезать. Чтение нестандартных .act, у которых размер меньше 768 - хорошо, но запись в .act можно сделать по стандарту.
paul_met, прикрепил мой вариант повторяющий функции на Python 3 (желательно последний) через CLI (командная строка). Вариант черновой и таким наверно останется, интерфейс и названия не очень, тесты не написаны и не проверено.
UPD: Добавлена установка 15-го бита
# 24 -> 15, Little-Endian порядок байтов у 15bit
pal_conv.py input.act output.littlepal
# 15 -> 24
pal_conv.py input.littlepal output.act -t24
# Big-Endian порядок байтов у 15bit
pal_conv.py input.act output.bigpal -be
# 15-й бит установлен в 1
pal_conv.py input.act output.littlepal -1
# Вырезать из input 90 байт, начиная с 3-го байта (30 цветов)
pal_conv.py input.act output.littlepal -si 3:90
# Вставить 8 байтов в файл, начиная с 10-го байта (4 цвета)
pal_conv.py input.act output.littlepal -so 10:8
Аргументы можно объединять. Начало и конец у -si/-so можно опускать.
UPD2: Числа у -si/-so можно указывать в HEX: -si 0x10:0x20. Также в bin (0b1010), oct (0o777).