我已经尝试过这个:
from PIL import Image
im = Image.open('this.webp')
im.save('that.gif', 'gif', save_all=True)
这给了我这个错误
TypeError:& 不支持的操作数类型:“tuple”和“int”
我的网站上有数百张 webp 图像,需要将它们转换为 gif,因为 Firefox 不支持。 谢谢你。
保存前将背景设置为无。
from PIL import Image
im = Image.open('this.webp')
im.info.pop('background', None)
im.save('that.gif', 'gif', save_all=True)
感谢:https://github.com/python-pillow/Pillow/issues/2949#issuecomment-419422861
这是一个很长但考虑到半透明情况的附加答案。
def process_frame(frame):
"""
Process GIF frame, repair edges, ensure no white or semi-transparent pixels, while keeping color information intact.
"""
frame = frame.convert('RGBA')
# Decompose Alpha channel
alpha = frame.getchannel('A')
# Process Alpha channel with threshold, remove semi-transparent pixels
# Threshold can be adjusted as needed (0-255), 128 is the middle value
threshold = 128
alpha = alpha.point(lambda x: 255 if x >= threshold else 0)
# Process Alpha channel with MinFilter, remove edge noise
alpha = alpha.filter(ImageFilter.MinFilter(3))
# Process Alpha channel with MaxFilter, repair edges
alpha = alpha.filter(ImageFilter.MaxFilter(3))
# Apply processed Alpha channel back to image
frame.putalpha(alpha)
return frame
为什么这么有效?
消除半透明像素:
阈值处理将半透明像素分别转换为完全透明或完全不透明像素,从而避免边缘出现白色或其他噪声。
光滑边缘:
腐蚀和膨胀的联合操作通过先缩小再扩大来平滑图像的边缘。腐蚀可以去除小噪声点,膨胀可以恢复主体部分——这样在消除小噪声的同时,尽可能保留大块的图像信息。
保留颜色信息:
由于只处理了Alpha通道,RGB颜色通道没有改变,所以颜色信息保持不变。
由于篇幅限制,我在WebM/WebP to GIF with semi-transparency(xzos.net)中记录了详细的推理步骤和完整的转换脚本(xzos.net)。