使用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
相关产品推荐
相关产品推荐

