如何使用PIL生成圆形缩略图?

如何使用PIL生成圆形图像缩略图? 圆圈外的空间应该是透明的。

片段将高度赞赏,谢谢你提前。

最简单的方法是使用蒙版。 创build一个你想要的任何形状的黑色和白色的面具。 并把这个形状作为一个alpha层

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') 

这是我用过的面具

替代文字


如果你想缩略图的大小是可变的,你可以使用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输出,那么你需要使用粘贴function,而不是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) 

请注意,我做了以下更改:

  • 面具现在倒置。 白色被replace为黑色,反之亦然。
  • 我正在用“自适应”调色板转换成“P”。 否则PIL将只使用网页安全的颜色,结果看起来很糟糕。
  • 我正在为图像添加透明度信息

请注意 :这种方法存在很大的问题。 如果gif图像包含黑色部分,它们全部也会变得透明。 您可以通过为透明度select另一种颜色来解决此问题。 我强烈build议你使用PNG格式。 但是,如果你不能那么这是你能做的最好的。

我想添加到已经接受的答案解决scheme抗锯齿结果圈,技巧是产生一个更大的掩码,然后使用ANTIALIASfilter缩小:这里是代码

 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) 

这在我看来产生了更好的结果。