2017-04-25 49 views
3
from PIL import Image 
from PIL import ImageDraw 
from io import BytesIO 
from urllib.request import urlopen 

url = "https://i.ytimg.com/vi/W4qijIdAPZA/maxresdefault.jpg" 
file = BytesIO(urlopen(url).read()) 
img = Image.open(file) 
img = img.convert("RGBA") 
draw = ImageDraw.Draw(img, "RGBA") 
draw.rectangle(((0, 00), (img.size[0], img.size[1])), fill=(0,0,0,127)) 
img.save('dark-cat.jpg') 

これは私に巨大な黒い四角形を与えています。私はそれが猫と半透明の黒い正方形になりたい。何か案は?PIL画像上に半透明の四角形のオーバーレイを描く

答えて

5

私が当初思ったように、明らかにバグではありません。

下図のようにあなたは、一時的な画像を作成し、 Image.alpha_composite()を使用することによってそれを行うことができます

from PIL import Image 
from PIL import ImageDraw 
from io import BytesIO 
from urllib.request import urlopen 

url = "https://i.ytimg.com/vi/W4qijIdAPZA/maxresdefault.jpg" 
file = BytesIO(urlopen(url).read()) 
img = Image.open(file) 
img = img.convert("RGBA") 

# make a blank image for the rectangle, initialized to a completely transparent color 
tmp = Image.new('RGBA', img.size, (0,0,0,0)) 

# get a drawing context for it 
draw = ImageDraw.Draw(tmp) 

# draw a semi-transparent rect on the temporary image 
draw.rectangle(((0, 0), img.size), fill=(0,0,0,127)) 

# composite the two images together 
img = Image.alpha_composite(img, tmp) 
img.save('dark-cat.jpg') 

ここで結果の縮小版だ:あなただけの場合

darken picture of a cat

+1

助けてくれてありがとう。私はちょうど新しい問題を作りました:https://github.com/python-pillow/Pillow/issues/2496 –

+0

@ChaseRobertsこれはバグではなく、「描く」が何をすべきか誤解しています。ブレンディングはしません。ピクセルのセットを新しいセットに置き換えます。 [ドキュメントの例](http://pillow.readthedocs.io/ja/3.1.x/reference/ImageDraw.html#example-draw-partial-opacity-text)は、これが2段階のプロセスであることを示しています。空白のキャンバスに不透明で描画し、結果を合成する。この答えの2番目の部分に示すように。 –

+0

@ MarkRansom:確かに、私の回避策はそれを行う方法です(一般的に言えば)。 – martineau

0

画像全体を暗くするには、より簡単な方法があります:

img = Image.eval(img, lambda x: x/2) 
関連する問題