2012-03-30 24 views
5

Mam obraz png jako tło i chcę dodać przezroczystą siatkę do tego tła, ale to nie działa zgodnie z oczekiwaniami. Obraz tła jest konwertowany na przezroczysty w miejscach, w których stosuję przezroczystą siatkę.Scalanie tła z przezroczystym obrazem w PIL

robie:

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) 

ale wynik jest:

enter image description here

Można zobaczyć szachownicę, jeśli przyjrzeć się dokładnie (stosowany w programach graficznych jak bez tła). Przezroczyste linie sprawiają, że warstwa tła jest przezroczysta również w miejscach, w których obie warstwy się spotkały. Ale chcę tylko, aby przezroczysta linia była dodawana na tle.

mogę rozwiązać go z:

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

ale jak stosować różne kolory dla różnych linii, to musiałby zrobić dla każdy kolor tego procesu. Gdybym miał 100 kolorów, potrzebowałbym 100 warstw, co nie jest zbyt dobrym rozwiązaniem.

+0

Możliwy duplikat http://stackoverflow.com/questions/5324647/how-to-merge-a-transparent-png-image-with-another-image-using- pil –

Odpowiedz

10

To, co próbujesz zrobić, to połączyć siatkę w tle, a do tego musisz użyć Image.blend lub Image.composite. Oto przykład stosując tę ​​ostatnią do kompozytowych czerwonych linii z losowych wartości alpha na białym tle:

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) 

Od lewej do prawej: tło, maski, pierwszy plan, wynik:

backgroundmaskforegroundcomposite

(Jeśli z przyjemnością napiszesz wynik z powrotem do obrazu tła, możesz użyć jednej z zamaskowanych wersji Image.paste, jak wskazano przez Paulo Scardine w usuniętej odpowiedzi).

0

Mam problem z poprawnym działaniem powyższych przykładów. Zamiast tego pracował dla mnie:

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 
Powiązane problemy