una turtle triangulo rellenar pintar linea hacer estrella dibujar cuadrado como circulo python image-processing

python - turtle - Dibujar polígonos semitransparentes en PIL



dibujar una linea en python (3)

¿Cómo se dibujan polígonos semitransparentes utilizando Python Imaging Library ?


¿Puedes dibujar el polígono en una imagen RGBA separada y luego usar el método Image.paste (imagen, caja, máscara) ?

Editar : Esto funciona.

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


Creo que la respuesta de @Nick T es buena, pero debes tener cuidado cuando uses su código como está escrito con una imagen de fondo muy grande, especialmente en el caso de que estés anotando varios polígonos en dicha imagen. Esto es algo que hago al procesar imágenes de satélite enormes con algún código de detección de objetos y anotar las detecciones usando un rectángulo transparente. Para que el código sea eficiente sin importar el tamaño de la imagen de fondo, hago la siguiente sugerencia.

Modificaría la solución para especificar que la imagen de polígono que pegará será tan grande como sea necesario para contener el polígono, no del mismo tamaño que la imagen de fondo. Las coordenadas del polígono se especifican con respecto al cuadro delimitador local, no las coordenadas globales de la imagen. Luego, pegue la imagen del polígono en el desplazamiento en la imagen de fondo más grande.

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()


El uso del método Image.paste (imagen, caja, máscara) convertirá el canal alfa en el área pegada de la imagen de fondo en el valor de transparencia correspondiente de la imagen del polígono.

El método Image.alpha_composite (im1, im2) utiliza el canal alfa de la imagen "pegada" y no convierte el fondo en transparente. Sin embargo, este método necesita dos imágenes de igual tamaño.