【问题标题】:How to convert PNG images to a transparent GIF?如何将PNG图像转换为透明的GIF?
【发布时间】:2021-06-01 19:08:44
【问题描述】:

我正在尝试将具有透明背景的 PNG 图像列表转换为 GIF,同时保持背景透明度。我拿了我找到的这段代码,并对其进行了修改:

import os
from PIL import Image

# Create the frames
frames = []

path = "directory/to/my/png/images"
for frame in os.listdir(path):
    new_frame = Image.open(path + "/" + frame)
    frames.append(new_frame)

# Save into a GIF file
frames[0].save(path + "/../output/animation.gif", format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=41, loop=1, transparency=0)

它正在打开我在一个文件夹中的所有 PNG 图像,并将它们导出为 GIF,但背景是黑色的。我看过PIL documentation,但我似乎不明白transparency参数是如何工作的,或者我认为我用错了。

【问题讨论】:

  • 试试透明度=100 ?
  • 我尝试了 0、100 和 255,但它们似乎都没有改变
  • 或尝试 new_frame = Image.open(path + "/" + frame, mode='RGBA') 或 frames[0].save(path + "/../output/animation.gif ", format='GIF', append_images=frames[1:], save_all=True, duration=41, loop=1,透明度=0, mode='RGBA')
  • 我不确定 PIL 默认是如何读取图像的,尝试找到它并确保默认情况下它们使用 alpha 通道(提供透明通道的通道)保存
  • open() 中的模式仅对应于读/写而不是 RGBA。我在保存中尝试了 mode='RGBA' 但也不起作用

标签: python python-imaging-library png transparency gif


【解决方案1】:

首先,the GIF format does not support alpha-channel transparency like PNG does. You can only select one out of the 256 possible colors in a GIF to be transparent。因此,您也不会得到任何平滑的透明度,像素要么是完全透明的,要么是不透明的。

在处理具有modeRGBAImage 对象时,请在保存之前尝试将所有图像转换为PA 模式。也许,这有助于自动

假设我们有以下三张图片:

您的最小化代码如下所示:

from PIL import Image

frames = [Image.open('red.png'), Image.open('green.png'), Image.open('blue.png')]

frames[0].save('test.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=200, loop=0, transparency=0)

生成的 GIF 实际上并不能反映单个 PNG 的透明度,GIF 已完全损坏:

将转换添加到模式PA,代码可能如下所示:

from PIL import Image

frames = [Image.open('red.png'), Image.open('green.png'), Image.open('blue.png')]

frames = [frame.convert('PA') for frame in frames]

frames[0].save('test.gif', format='GIF',
               append_images=frames[1:],
               save_all=True,
               duration=200, loop=0, transparency=0)

而且,结果很好,保持透明度:

我不知道,该路线是否适用于任意 PNG,但值得用您的图像进行测试,不是吗?如果这不起作用,您需要提供一些输入图像以进行进一步测试。

最后一种方法是用某种颜色(比如纯黄色)替换 PNG 中的所有透明像素。稍后保存 GIF 时,您需要确保所有图像的调色板都将纯黄色存储在同一索引处,然后最后将 transparency 设置为该索引。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
Pillow:        8.1.0
----------------------------------------

【讨论】:

  • 谢谢,它成功了。但是有很多噪音,但我想我不能用 GIF 格式做得更好(我的文件真的很大)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2010-10-02
  • 2015-01-26
  • 1970-01-01
  • 2020-11-26
相关资源
最近更新 更多