如何使用 PIL 生成圆形缩略图?
-
23-08-2019 - |
题
如何使用 PIL 生成圆形图像缩略图?圆圈外的空间应该是透明的。
片段将不胜感激,提前谢谢您。
解决方案
最简单的方法是使用面具。创建一个具有任何您想要的形状的黑白蒙版。并使用 putalpha
将该形状作为 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 格式的输出,那么你需要使用粘贴功能而不是 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 格式。但如果你做不到,那就是你能做的最好的事情了。
其他提示
我想添加到已接受的答案解决抗混叠所产生的圈,关键是要产生一个更大的掩模,然后使用抗混叠滤波器规模下来: 这里是代码
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)
这产生在我看来好得多的结果。
不隶属于 StackOverflow