2012-03-30 7 views
5

Tôi có hình nền png làm nền và tôi muốn thêm lưới trong suốt vào nền này nhưng điều này không hoạt động như mong đợi. Hình nền được chuyển thành minh bạch ở những nơi tôi áp dụng lưới trong suốt.Kết hợp nền với hình ảnh trong suốt trong PIL

tôi đang làm:

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) 

Nhưng kết quả là:

enter image description here

Bạn có thể thấy một mô hình bàn cờ nếu bạn xem xét cẩn thận (được sử dụng trong các chương trình đồ họa như là không có nền). Các đường trong suốt cũng làm cho lớp nền trong suốt ở những nơi cả hai lớp đều gặp nhau. Nhưng tôi chỉ muốn dòng trong suốt được thêm vào trên nền.

tôi có thể giải quyết nó với:

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

nhưng khi tôi sử dụng màu sắc khác nhau cho các dây chuyền khác nhau, tôi sẽ phải làm cho mọi màu sắc quá trình này. Nếu tôi có 100 màu, thì tôi cần 100 lớp không phải là giải pháp tốt lắm.

+0

Có thể trùng lặp của http://stackoverflow.com/questions/5324647/how-to-merge-a-transparent-png-image-with-another-image-using- pil –

Trả lời

10

Những gì bạn đang cố gắng làm là kết hợp lưới vào nền và để bạn cần sử dụng Image.blend hoặc Image.composite. Dưới đây là một ví dụ sử dụng sau này để đường màu đỏ hợp với các giá trị alpha ngẫu nhiên vào một nền trắng:

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) 

Từ trái sang phải: nền, mặt nạ, foreground, kết quả:

backgroundmaskforegroundcomposite

(Nếu bạn vui lòng ghi kết quả trở lại hình nền, thì bạn có thể sử dụng một trong các phiên bản đeo mặt nạ của Image.paste, như được chỉ ra bởi Paulo Scardine trong câu trả lời đã xóa.)

0

Tôi gặp sự cố khi tải các ví dụ trên để hoạt động tốt. Thay vào đó, điều này làm việc cho tôi:

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