如何使用Python将WebP图像转换为Gif?

问题描述 投票:0回答:2

我已经尝试过这个:

from PIL import Image
im = Image.open('this.webp')
im.save('that.gif', 'gif', save_all=True)

这给了我这个错误

TypeError:& 不支持的操作数类型:“tuple”和“int”

我的网站上有数百张 webp 图像,需要将它们转换为 gif,因为 Firefox 不支持。 谢谢你。

python python-imaging-library gif webp
2个回答
8
投票

保存前将背景设置为无。

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


0
投票

这是一个很长但考虑到半透明情况的附加答案。

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

为什么这么有效?

  1. 消除半透明像素:

    阈值处理将半透明像素分别转换为完全透明或完全不透明像素,从而避免边缘出现白色或其他噪声。

  2. 光滑边缘:

    腐蚀和膨胀的联合操作通过先缩小再扩大来平滑图像的边缘。腐蚀可以去除小噪声点,膨胀可以恢复主体部分——这样在消除小噪声的同时,尽可能保留大块的图像信息。

  3. 保留颜色信息:

    由于只处理了Alpha通道,RGB颜色通道没有改变,所以颜色信息保持不变。

由于篇幅限制,我在WebM/WebP to GIF with semi-transparency(xzos.net)中记录了详细的推理步骤和完整的转换脚本(xzos.net)。

© www.soinside.com 2019 - 2024. All rights reserved.