如何使用 PIL 生成圆形图像缩略图?圆圈外的空间应该是透明的。
片段将不胜感激,在此先感谢您。
如何使用 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)
请注意,我做了以下更改:
请注意:这种方法存在一个大问题。如果 GIF 图像包含黑色部分,它们也将全部变为透明。您可以通过为透明度选择另一种颜色来解决此问题。我强烈建议您为此使用 PNG 格式。但如果你不能,那是你能做的最好的。
我想在已经接受的答案中添加一个解决方案来解决产生的圆的抗锯齿,诀窍是产生一个更大的蒙版,然后使用 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)
在我看来,这会产生更好的结果。
对@DRC 的解决方案稍作修改,以支持已经具有透明度的图像。他将 alpha 通道设置为圆圈外的 0(不可见)和内部的 255(不透明),所以我使用darker
它取蒙版的最小值和原始 alpha 通道(可以在 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')
非常感谢你。我一直在寻找几个小时,你的想法成功了。
连同那里的其他脚本。 PIL 圆形边缘并添加边框 它对我来说非常适合。
from PIL import Image
from PIL import ImageDraw, ImageChops
def add_corners( im, rad=100):
circle = Image.new('L', (rad * 2, rad * 2), 0)
draw = ImageDraw.Draw(circle)
draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
alpha = Image.new('L', im.size, "white")
w, h = im.size
alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
alpha = ImageChops.darker(alpha, im.split()[-1])
im.putalpha(alpha)
return im
im = Image.open ('AceOfSpades.png').convert('RGBA')
im = add_corners (im, 24)
im.show()
im.save("perfect.png")