2012-03-30 29 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を使用する必要があります。ここで、白い背景の上にランダムアルファ値を有する複合赤線に後者を使用した例は次のとおり

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) 

左から右へ:背景、マスク、前景、結果:

backgroundmaskforegroundcomposite

(結果をバックグラウンドイメージに書き込んでも構わない場合は、で指摘されているように、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 
関連する問題