Заменить цвета в палитре (Python 3.7)
Я использую простую линию, чтобы разбить индексированное изображение 256 цветов на палитру, используя
import numpy as np
from PIL import Image
im = Image.open('')
palette = np.array(im.getpalette(),dtype=np.uint8).reshape((256,3))
#####################
Printed result
[[ 1 3 0]
[ 2 4 1]
[ 28 0 4]
[ 20 2 26]
[ 24 5 18]
[ 33 7 22]
[ 36 7 12]
[ 0 20 18]
[ 42 15 16]
[ 43 18 30]
... так далее
"Палитра" печати отображает цвета как значения RGB, начиная с индекса 0 и далее. Индекс 0 часто бывает темного или черного цвета. В некоторых движках используется для альфа, прозрачности. Я хочу использовать часто используемые цвета для прозрачности, например пурпурный 255 0 255
Я хочу взять каждый из моих png-файлов в папку и выполнить пакетную обработку (мне придется вручную добавить цвет к изображениям, а затем сохранить их как 8-битные, чтобы цвет был частью палитры), затем выполните:
- поменять положение цвета индекса 0 на пурпурный на карте цветов
- положение пурпурного цвета будет различаться для каждого файла, просто найдите цвет 255 0 25 и замените им цвет с индексом 0, но также возьмите цвет индекса 0 и поместите его на место пурпурного
- сделать для всех файлов.png в папке за один запуск (пурпурный цвет будет добавлен, а изображения проиндексированы перед запуском скрипта)
1 ответ
Я думаю, вам нужно что-то вроде этого:
#!/usr/bin/env python3
import numpy as np
from PIL import Image
# Open image
im = Image.open('image.png')
# Extract palette
palette = np.array(im.getpalette(),dtype=np.uint8).reshape((256,3))
# Look through palette
for index,entry in enumerate(palette):
# Swap this entry with entry 0 if this is magenta
if index>0 and np.all(entry==[255,0,255]):
print(f'DEBUG: Swapping entry {index} with entry 0')
palette[0], palette[index] = palette[index], palette[0]
break
else:
print('ERROR: Did not find magenta entry in palette')
# Replace palette with new one and save
im.putpalette(palette)
im.save('result.png')
Вы, вероятно, закодировали бы его для приема нескольких файлов в командной строке следующим образом:
for file in sys.argv[1:]:
...
...
Тогда вы могли бы запустить:
UpdatePalette.py *.png