Рисование полупрозрачных полигонов в PIL

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

Ответ 1

Можете ли вы нарисовать многоугольник на отдельном изображении RGBA, а затем использовать метод Image.paste(изображение, окно, маска)?

Изменить. Это работает.

from PIL import Image
from PIL import ImageDraw
back = Image.new('RGBA', (512,512), (255,0,0,0))
poly = Image.new('RGBA', (512,512))
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)],
              fill=(255,255,255,127),outline=(255,255,255,255))
back.paste(poly,mask=poly)
back.show()

http://effbot.org/imagingbook/image.htm#image-paste-method

Ответ 2

Я думаю, что @Nick T ответ хороший, но вам нужно быть осторожным при использовании его кода, написанного с очень большим фоном, особенно в случае, когда вы можете аннотировать несколько полигонов на указанном изображении. Это то, что я делаю при обработке огромных спутниковых изображений с помощью некоторого кода обнаружения объекта и аннотации обнаружений с использованием прозрачного прямоугольника. Чтобы сделать код эффективным независимо от размера фонового изображения, я делаю следующее предложение.

Я бы изменил решение, чтобы указать, что изображение многоугольника, которое вы вставляете, будет таким же большим, как требуется для удержания многоугольника, но не того же размера, что и обратное изображение. Координаты многоугольника задаются относительно локального ограничивающего прямоугольника, а не глобальных координат изображения. Затем вы вставляете многоугольное изображение со смещением в более крупном фоновом изображении.

import Image
import ImageDraw
img_size = (512,512)
poly_size = (256,256)
poly_offset = (128,128) #location in larger image
back = Image.new('RGBA', img_size, (255,0,0,0) )
poly = Image.new('RGBA', poly_size )
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([ (0,0), (256,256), (0,256), (256,0)], 
              fill=(255,255,255,127), outline=(255,255,255,255))
back.paste(poly, poly_offset, mask=poly)
back.show()

Ответ 3

Использование метода Image.paste(изображение, окно, маска) преобразует альфа-канал в вставленной области фонового изображения в соответствующее значение прозрачности изображения многоугольника.

В методе Image.alpha_composite (im1, im2) используется альфа-канал "вставленного" изображения и не будет превращать фон в прозрачный. Однако этот метод снова нуждается в двух изображениях одинакового размера.