2012-03-30 18 views
5

Ich habe ein PNG-Bild als Hintergrund und ich möchte ein transparentes Netz zu diesem Hintergrund hinzufügen, aber das funktioniert nicht wie erwartet. Das Hintergrundbild wird an den Stellen transparent, an denen ich transparentes Netz anlege.Hintergrund mit transparentem Bild in PIL verschmelzen

ich tue:

from PIL import Image, ImageDraw 

map_background = Image.open(MAP_BACKGROUND_FILE).convert('RGBA') 
map_mesh = Image.new('RGBA', (width, height), (0, 0, 0, 0)) 
draw = ImageDraw.Draw(map_mesh) 

# Create mesh using: draw.line([...], fill=(255, 255, 255, 50), width=1) 
... 

map_background.paste(map_mesh, (0, 0), map_mesh) 

Aber das Ergebnis ist:

enter image description here

Sie können ein Schachbrettmuster sehen, wenn Sie genau hinschauen (in Grafikprogrammen wie kein Hintergrund verwendet). Transparente Linien machen die Hintergrundebene auch dort transparent, wo beide Ebenen zusammentreffen. Aber ich möchte nur die transparente Linie über dem Hintergrund hinzugefügt werden.

ich lösen kann es mit:

map_background.paste ((255,255,255), (0, 0), map_mesh)

aber als ich für verschiedene Linien unterschiedliche Farben verwenden, würde ich für machen müssen jede Farbe diesen Prozess. Wenn ich 100 Farben hätte, dann brauche ich 100 Schichten, was keine sehr gute Lösung ist.

+0

Mögliche Duplikat http://stackoverflow.com/questions/5324647/how-to-merge-a-transparent-png-image-with-another-image-using- pil –

Antwort

10

Was Sie versuchen, ist das Gitter in den Hintergrund zu kombinieren, und dafür müssen Sie Image.blend oder Image.composite verwenden. Hier ist ein Beispiel für die letztere Verbund roter Linien mit zufälligen Alpha-Werten auf einen weißen Hintergrund mit:

import Image, ImageDraw, random 
background = Image.new('RGB', (100, 100), (255, 255, 255)) 
foreground = Image.new('RGB', (100, 100), (255, 0, 0)) 
mask = Image.new('L', (100, 100), 0) 
draw = ImageDraw.Draw(mask) 
for i in range(5, 100, 10): 
    draw.line((i, 0, i, 100), fill=random.randrange(256)) 
    draw.line((0, i, 100, i), fill=random.randrange(256)) 
result = Image.composite(background, foreground, mask) 

Von links nach rechts: Hintergrund, Maske, Vordergrund, Ergebnis:

backgroundmaskforegroundcomposite

(Wenn Sie das Ergebnis zurück in das Hintergrundbild schreiben möchten, können Sie eine der maskierten Versionen von Image.paste verwenden, wie von Paulo Scardine in einer gelöschten Antwort angezeigt.)

0

Ich hatte Probleme, die obigen Beispiele gut funktionieren zu lassen. Stattdessen dies für mich gearbeitet:

import numpy as np 
import Image 
import ImageDraw 

def add_craters(image, craterization=20.0, width=256, height=256): 

    foreground = Image.new('RGBA', (width, height), (0, 0, 0, 0)) 
    draw = ImageDraw.Draw(foreground) 

    for c in range(0, craterization): 
     x = np.random.randint(10, width-10) 
     y = np.random.randint(10, height-10) 
     radius = np.random.randint(2, 10) 
     dark_color = (0, 0, 0, 128) 
     draw.ellipse((x-radius, y-radius, x+radius, y+radius), fill=dark_color) 

    image_new = Image.composite(foreground, image, foreground) 
    return image_new 
Verwandte Themen