2012-03-30 3 views
5

배경으로 png 이미지가 있는데이 배경에 투명 메쉬를 추가하고 싶지만 예상대로 작동하지 않습니다. 투명한 메쉬를 적용한 곳에서는 배경 이미지가 투명으로 변환됩니다.PIL에서 투명 이미지로 배경 병합

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) 

을하지만 결과는 다음과 같습니다 :

내가 뭐하는 거지주의 깊게 보면 (어떤 배경으로 그래픽 프로그램에서 사용되는) 경우

enter image description here

당신은 체스 판 패턴을 볼 수 있습니다. 투명한 선은 두 레이어가 만난 곳에서도 배경 레이어를 투명하게 만듭니다. 하지만 투명 선을 배경 위에 추가하기 만하면됩니다.

내가 그것을 해결할 수 : 나는 다른 라인에 대해 서로 다른 색상을 사용으로

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

하지만, 나는 있도록 할 것 모든 과정에서이 과정. 100 가지 색상이 있다면 매우 좋은 해결책이 아닌 100 가지 레이어가 필요합니다.

+0

의 가능한 중복 http://stackoverflow.com/questions/5324647/how-to-merge-a-transparent-png-image-with-another-image-using- 말뚝 –

답변

10

그리드를 배경에 합성하는 것이므로 Image.blend 또는 Image.composite을 사용해야합니다. 배경 마스크 전경 결과 :

backgroundmaskforegroundcomposite

왼쪽에서 오른쪽

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) 

: 여기 흰색 배경에 임의의 알파 값을 가진 복합체 빨강 라인 후자를 사용하는 예이다

(배경 이미지에 결과를 기꺼이 쓸 수 있으면 삭제 된 답변에서 Paulo Scardine으로 지적한 Image.paste의 마스크 된 버전 중 하나를 사용할 수 있습니다.)

0

위의 예제가 제대로 작동하지 못했습니다. 대신이 나를 위해 일한 :

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