2010-06-25 22 views

Respuesta

14

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

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

4

creo @Nick T 's respuesta es buena, pero hay que tener cuidado al usar su código como escrito una imagen de fondo muy grande con, sobre todo en el caso de que se le puede 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() 
1

Uso de la Image.paste (imagen, caja, máscara) método convertirá el canal alfa en la zona de pegado de la imagen de fondo en el valor de transparencia correspondiente de la imagen 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.