Заменить цвета в палитре (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
Другие вопросы по тегам