PIL - 将半透明多边形添加到JPEG

3
我正在尝试使用这种方法向图像添加半透明多边形,但问题在于该图像是JPEG格式。我知道JPEG没有alpha通道,所以我希望有一种方法可以让PIL接收JPEG格式,将其转换为具有alpha通道的形式,添加半透明遮罩,然后将遮罩与图像合并并将其转换回JPEG格式进行保存。PIL能够实现吗?如果不能,我该如何处理?谢谢!
1个回答

7
很简单。只需将jpeg粘贴到新的rgba Image()中即可:
#!/usr/bin/env python3

from PIL import Image
from PIL import ImageDraw

im = Image.open("existing.jpg")
logo = Image.open("python-32.png")

back = Image.new('RGBA', im.size)
back.paste(im)
poly = Image.new('RGBA', (512,512))
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)],
          fill=(255,255,255,127),outline=(255,255,255,255))

back.paste(poly, (0,0), mask=poly)
back.paste(logo, (im.size[0]-logo.size[0], im.size[1]-logo.size[1]), mask=logo)

back.show()

这还会在图像中添加一个带透明度的png文件。


干得好!我可以问一个问题吗?我刚刚使用了你的代码(没有logo),我发现如果我想保存back,我必须使用pngjpg会引发错误)。然而,back的大小比原始图像大5倍。我们有办法减小back的大小吗? - Yves
@Yves 无法重现您所描述的情况。当我将 back.show() 替换为 back.save('back.jpg', 'JPEG') 时,图像会按预期保存。也许您应该发布一个新问题,并提供完整的错误描述。(您可以添加一条以 @tnt 开头的评论,这样我就会收到通知。) - TNT
https://dev59.com/zaTia4cB1Zd3GeqP9CNa - Yves
似乎是由新的小版本引入的新功能失败:在将我的 pillow 4.1.1 升级到 4.2.1 后,我也遇到了异常(解决方案在新的问题的答案中)。 - TNT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接