Рисование полигонов различной прозрачности друг над другом в Python Pillow/PIL

У меня есть следующий код:

im = Image.new("RGBA", (800,600))
draw = ImageDraw.Draw(im,"RGBA")
draw.polygon([(10,10),(200,10),(200,200),(10,200)],(20,30,50,125))
draw.polygon([(60,60),(250,60),(250,250),(60,250)],(255,30,50,0))
del draw 
im.show()

но полигоны не имеют различий в альфе/прозрачности между ними. Можно ли сделать это, используя эти полигоны, или альфа-уровень применяется только к составным изображениям (я знаю об этом решении, но вижу только комментарии, основанные на PIL, и подумал, что видел это исправленным в Pillow).

Если такая вещь недоступна, есть ли хороший, простой и эффективный способ поместить что-то подобное в библиотеку?


person user1170304    schedule 16.08.2013    source источник


Ответы (2)


Согласно документу http://effbot.org/imagingbook/image.htm:

im.show()

Отображает изображение. Этот метод в основном предназначен для отладки.

На платформах Unix этот метод сохраняет изображение во временный файл PPM и вызывает утилиту xv.

Насколько я знаю, формат файла PPM не поддержка прозрачности ("альфа-канал").


Итак... прозрачность не появляется, когда вы вызываете im.show(), но она будет применена, если вы сохраните файл в формате, поддерживающем прозрачность:

from PIL import Image,ImageDraw

im = Image.new("RGBA", (800,600))
draw = ImageDraw.Draw(im,"RGBA")
draw.polygon([(10,10),(200,10),(200,200),(10,200)],(20,30,50,125))
draw.polygon([(60,60),(250,60),(250,250),(60,250)],(255,30,50,120))
del draw

im.save("out.png") # Save to file
person Sylvain Leroux    schedule 16.08.2013
comment
И даже если PPM поддерживает прозрачность, если вы отображаете изображение с частичной прозрачностью в сплошном сером окне… вы просто получите частично серые пиксели. - person abarnert; 17.08.2013
comment
Во всяком случае, было исключение PPM с прозрачностью, но оно никуда не делось, как и расширение 16bpp. Если вы хотите что-то необычное, вместо этого вам нужно использовать PAM. И никто этого не делает, потому что проще просто использовать что-то вроде PNG для обмена и собственный формат для внутренней памяти. - person abarnert; 17.08.2013
comment
Этот метод применяет альфа-канал только к окончательному изображению, то есть прозрачный квадрат рисуется поверх другого прозрачного квадрата, но квадрат под ним все еще скрыт. Хотя по крайней мере теперь у меня есть прозрачность спасибо. - person user1170304; 17.08.2013
comment
У меня были проблемы с прозрачностью, которая не применялась правильно к обоим полигонам, изменение типа изображения на RGB исправило это: im = Image.new(RGB, (800,600)) - person Adam S.; 29.03.2014

Это может помочь:

Как вы рисуете прозрачные многоугольники с помощью Python?

Для добавления альфа-канала к конечному изображению вы можете использовать Image.putalpha(alpha).

person Matt    schedule 14.02.2014