如何使用Pillow创建和保存灰度图像的gif动画?

4
当我运行这段代码时,出现了属性错误。 这段代码适用于另一个RGB数据集。 Python3.6,windows10。
代码:
    image_dirs = glob.glob(denoised_dir + "/*")
    for_gif = []
    counter = 0 
    for (count, each_dir)in enumerate(image_dirs):
        images = glob.glob(each_dir + "/*")
        print(images)
        for image in images:
            counter += 1
            print(counter)
            print("processing denoised image:", image)
            im = Image.open(image)
            print("confirmimation", type(im))
            for_gif.append(im)
            print("counter", counter)
            print("for_gif", len(for_gif))
        print(for_gif)
        os.makedirs("./outputs/noise/gif/"+str(args.imgsize) + "_" + str(args.epochs) + "/" + args.image_type, exist_ok = True)
        print("directory created")
        for_gif[0].save("./outputs/noise/gif/"+str(args.imgsize) + "_" + str(args.epochs) + "/" + args.image_type + "/" + str(count) + ".gif", 
                        save_all=True, 
                        append_images=for_gif[1:],
                        optimize=False, 
                        duration=500, 
                        loop=0
                        )

并且for_gif如下所示:

[<PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A07CF28>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0EC7F0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0F08D0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0F0BE0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC080>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120
at 0x1FE2A0FC0F0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC160>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC1D0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC240>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC2B0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC320>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC390>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC400>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC470>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC4E0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC550>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC5C0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC630>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC6A0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC710>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC780>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC7F0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC860>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC8D0>, <PIL.PngImagePlugin.PngImageFile image mode=L size=120x120 at 0x1FE2A0FC940>]

错误:

AttributeError: 'NoneType' object has no attribute 'palette'

任何建议都会对我有所帮助。谢谢。

2
只是猜测,但您的图像似乎是灰度(L),但它似乎正在寻找调色板,因此请尝试在打开时更改为调色板模式,即 im = Image.open(image).convert('P') - Mark Setchell
@MarkSetchell 抱歉沉默了一段时间。它实际上有效了!非常感谢。 - user9191983
2个回答

0

虽然 Image.open(image).convert('P') 可以工作,但是当我先将图像转换为灰度图时,效果更好:Image.open(image).convert('L').convert('P')

如果不显式地将图像转换为灰度图,则 GIF 图像会出现一些彩色噪点。


-1

我认为错误发生是因为你将'L'赋值给了图像模式

在我的情况下,调色板模式'P'可以正常工作。

import numpy as np
from PIL import Image 

images=[]
for frame_id in range(frame_num):
    # check image mode of target data
    im_pil = Image.open("frame_id"+ ".png").convert('P') 
    images.append(im_pil)

images[0].save('out.gif', save_all=True, append_images=images[1:])

请注意,GIF文件始终被读取为灰度('L')或调色板模式('P')图像。
参考:

1
我已经编辑了答案,而你却拒绝它并将其发布为自己的,这是不好的行为。 - Dulaj Kulathunga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接