Как вы рисуете полупрозрачные полигоны с помощью Python Imaging Library?
Рисование полупрозрачных полигонов в PIL
Ответ 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()
Ответ 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) используется альфа-канал "вставленного" изображения и не будет превращать фон в прозрачный. Однако этот метод снова нуждается в двух изображениях одинакового размера.