如何用PIL生成圆形缩略图?
我该如何使用PIL生成圆形的图片缩略图?
圆圈外面的部分应该是透明的。
如果能提供一些代码片段,那就太好了,提前谢谢你!
5 个回答
3
对@DRC的解决方案稍微做了一些修改,以支持已经有透明度的图片。他把圆圈外的透明度设置为0(看不见),圆圈内的透明度设置为255(不透明),所以我使用了darker
,它会取遮罩和原始透明度中的最小值(原始透明度的值可以在0到255之间变化):-)
from PIL import Image, ImageChops, ImageDraw
def crop_to_circle(im):
bigsize = (im.size[0] * 3, im.size[1] * 3)
mask = Image.new('L', bigsize, 0)
ImageDraw.Draw(mask).ellipse((0, 0) + bigsize, fill=255)
mask = mask.resize(im.size, Image.ANTIALIAS)
mask = ImageChops.darker(mask, im.split()[-1])
im.putalpha(mask)
im = Image.open('0.png').convert('RGBA')
crop_to_circle(im)
im.save('cropped.png')
42
我想在已经被接受的答案上补充一个方法,用来让生成的圆形边缘更平滑。这个方法的关键是先制作一个更大的遮罩,然后再用抗锯齿滤镜缩小它。以下是代码:
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)
我觉得这样做的效果要好得多。
98
最简单的方法就是使用蒙版。你可以创建一个黑白的蒙版,形状随你喜欢。然后用 putalpha
把这个形状作为透明层放上去:
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格式来处理这个问题。如果不行,那这就是你能做到的最好方法。