You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PIL生成GIF时颜色异常:灰色鼠标显示为青色的问题及解决

问题:PIL生成GIF时颜色异常(灰色老鼠变为青色)

我需要将一组PIL图像转换为GIF,内容是灰色老鼠在迷宫中跟随青色圆点移动,但保存后的GIF里老鼠显示为青色。imgs列表中的图像是正确的——用plt.imshow(imgs[0])可以看到预期的灰色老鼠,但保存成GIF后颜色就乱了。我试过用imageio和PIL.Image.save两种方式保存,结果颜色问题一致。

原生成代码

import PIL

imgs = []
fig, ax = plt.subplots(1, 1, figsize=(4, 4))

# np_grids是用于渲染迷宫帧的网格列表
for idx, grid in enumerate(np_grids): 
    # [在ax上绘制内容的代码]
    
    # 将轴转换为图像
    fig.tight_layout()
    fig.canvas.draw()
    img = PIL.Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb())
    imgs.append(img)

target_file = 'example.gif'

start_step = 25 # 从此步骤开始生成GIF

# 保存GIF
imgs[start_step].save(target_file, format="GIF", save_all=True, append_images=imgs[start_step+1:], duration=100, loop=0)

解决方案

问题根源在于GIF的调色板机制:GIF使用全局调色板,默认情况下PIL会为每一帧单独生成调色板,导致不同帧的颜色映射不一致,最终出现颜色错乱。

通过统一所有帧的调色板即可解决问题——先对第一帧进行量化生成调色板,后续所有帧都使用这个调色板进行量化。修改后的图像生成代码如下:

img = PIL.Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb())
    if idx == 0: # 量化第一帧并生成全局调色板
        img = img.quantize(colors=254, method=PIL.Image.Quantize.MAXCOVERAGE)
    else: # 后续帧使用第一帧的调色板量化
        img = img.quantize(colors=254, palette=imgs[0], method=PIL.Image.Quantize.MAXCOVERAGE)
    imgs.append(img)

内容的提问来源于stack exchange,提问作者Alexander Turner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:10:06