2010-06-25 9 views

Antwort

14

Können Sie das Polygon auf einem separaten RGBA-Bild zeichnen, dann verwenden Sie die Image.paste (Bild, Box, Maske) Methode?

Bearbeiten: Das funktioniert.

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

denke ich @Nick T ‚s Antwort ist gut, aber man muss vorsichtig sein, wenn seinen Code geschrieben mit einem sehr großen Hintergrundbild verwenden, vor allem in dem Fall, dass Sie mehrere Anmerkungen versehen werden können, Polygone auf dem Bild. Dies ist etwas, das ich mache, wenn ich riesige Satellitenbilder mit einem Objekt-Erkennungscode verarbeite und die Erkennungen mit einem transparenten Rechteck annotiere. Um den Code effizient zu machen, egal wie groß das Hintergrundbild ist, mache ich den folgenden Vorschlag.

Ich würde die Lösung ändern, um anzugeben, dass das Polygonbild, das Sie einfügen, nur so groß wie erforderlich ist, um das Polygon zu halten, nicht die gleiche Größe wie das Hintergrundbild. Die Koordinaten des Polygons werden in Bezug auf den lokalen Begrenzungsrahmen angegeben, nicht die globalen Bildkoordinaten. Dann fügen Sie das Polygonbild am Versatz im größeren Hintergrundbild ein.

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

Verwenden die Image.paste (Bild, Box, Maske) Methode wird den Alpha-Kanal in dem eingefügten Bereich des Hintergrundbildes in den entsprechenden Transparenzwert des Polygon-Bildes konvertieren.

Die Image.alpha_composite (im1, im2) Methode verwendet den Alpha-Kanal des "eingefügten" Bildes und wird den Hintergrund nicht transparent machen. Diese Methode benötigt jedoch erneut zwei gleich große Bilder.

Verwandte Themen