2009-05-20 32 views

回答

62

最簡單的方法是使用蒙版。創建一個你想要的任何形狀的黑色和白色面具。並把該形狀的阿爾法層

from PIL import Image, ImageOps 

mask = Image.open('mask.png').convert('L') 
im = Image.open('image.png') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

下面是我用

alt text


面膜如果你想縮略圖大小是可變的,你可以使用ImageDraw並繪製面具。

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=255) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.putalpha(mask) 
output.save('output.png') 

如果你想在GIF輸出,那麼你需要使用粘貼功能,而不是putalpha的:

from PIL import Image, ImageOps, ImageDraw 

size = (128, 128) 
mask = Image.new('L', size, 255) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + size, fill=0) 
im = Image.open('image.jpg') 
output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) 
output.paste(0, mask=mask) 
output.convert('P', palette=Image.ADAPTIVE) 
output.save('output.gif', transparency=0) 

注意,我做了如下修改:

  • 面具現在倒置。白色 被替換爲黑色,反之亦然。
  • 我正在用'自適應'調色板轉換成'P'。否則,PIL將只使用網頁安全色,結果看起來很糟糕。
  • 我加入透明的信息與該圖像

請注意:有這種方法的一個大問題。如果gif圖像包含黑色部分,它們全部也會變得透明。您可以通過爲透明度選擇另一種顏色來解決此問題。 我強烈建議你爲此使用PNG格式。但如果你不能那麼這是你能做的最好的。

+0

太棒了!輸出gif而不是png怎麼樣?我猜gif不處理alpha,是嗎? – ohnoes 2009-05-20 23:07:28

+0

Gif不支持Alpha通道透明度。它只支持將一種顏色設置爲透明。但是,我做了必要的調整,以gif輸出結果。 – 2009-05-20 23:34:08

19

我想添加到已接受的答案解決抗鋸齒所產生的圓圈,關鍵是要產生一個更大的面具,然後使用抗混疊濾波器規模下來: 這裏是代碼

from PIL import Image, ImageOps, ImageDraw 

im = Image.open('image.jpg') 
bigsize = (im.size[0] * 3, im.size[1] * 3) 
mask = Image.new('L', bigsize, 0) 
draw = ImageDraw.Draw(mask) 
draw.ellipse((0, 0) + bigsize, fill=255) 
mask = mask.resize(im.size, Image.ANTIALIAS) 
im.putalpha(mask) 

這在我看來產生了一個更好的結果。