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

ohn*_*oes 41 python geometry thumbnails python-imaging-library

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

片段将受到高度赞赏,谢谢你提前.

Nad*_*mli 73

最简单的方法是使用面具.使用您想要的任何形状创建黑白面具.并将该形状作为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')
Run Code Online (Sandbox Code Playgroud)

这是我用过的面具

替代文字


如果希望缩略图大小可变,可以使用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')
Run Code Online (Sandbox Code Playgroud)

如果你想要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)
Run Code Online (Sandbox Code Playgroud)

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

  • 面具现在倒置了.白色替换为黑色,反之亦然.
  • 我正在使用'自适应'调色板转换为'P'.否则PIL将只使用Web安全颜色,结果看起来很糟糕.
  • 我正在为图像添加透明度信息

请注意:这种方法存在很大问题.如果gif图像包含黑色部分,则所有这些部分也将变为透明.您可以通过为透明度选择另一种颜色来解决此问题.我强烈建议你使用PNG格式.但如果你不能那么那就是你能做的最好的事情.


DRC*_*DRC 29

我想在已经接受的答案中添加一个解决方案来解决生成的圆圈,诀窍是生成一个更大的掩码,然后使用ANTIALIAS过滤器将其缩小:这里是代码

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)
Run Code Online (Sandbox Code Playgroud)

在我看来,这会产生更好的结果.

  • Dude,ANTIALIAS做出了巨大的改变!谢谢!= d (3认同)
  • 有史以来最好的提示! (2认同)