Python PIL: создание индексированного цветного изображения с прозрачным фоном - PullRequest
4 голосов
/ 12 октября 2011

Интересно, как я мог создать изображение с прозрачным фоном и только 2 индексированных цвета (красный и синий), чтобы минимизировать размер файла?

В частности, у меня есть два черно-белых изображения, которые я хочу преобразовать: одно в прозрачное и синее, а другое в прозрачное и красное. Затем я хочу объединить эти 2 изображения. Я мог бы сделать это с обычным изображением RGBA, но я действительно хочу, чтобы цвет был проиндексирован, чтобы минимизировать размер файла.

В идеале с PIL, но может работать и другая библиотека Python.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Так что мне удалось сделать это, используя тип изображения "palette", но полученный файл не такой маленький, как я ожидал ... Вот мой код на случай, если он будет полезен для кого-то другого, или если кто-то может улучшить его.

from PIL import Image

im = Image.open("image1.png")
imP = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=3)
imP.putpalette([
    0, 0, 0, # index 0 is black background
    0, 0, 255, # index 1 is blue
    255, 0, 0, # index 2 is red ])

im2 = Image.open("image2.png")
imP2L = im2.convert('L') # need a greyscale image to create a mask
mask = Image.eval(imP2L, lambda a: 255 if a == 0 else 0)
imP.paste(2, mask) # Paste the color of index 2 using image2 as a mask
imP.save('out3.png', transparency = 0, optimize = 1) # Save and set index 0 as transparent
0 голосов
/ 12 октября 2011

После объединения двух изображений у вас больше не будет двух цветов - цвета будут комбинироваться на основе прозрачности каждого из них в каждом пикселе.В худшем случае у вас будет 256 * 256 = 65536 цветов, которые нельзя проиндексировать и которые не будут хорошо сжиматься, если вы это сделаете.

Я бы предложил сохранить в формате PNG и позволить сжатию без потерь делать все возможное.

...