Python将图像拆分为帧,颜色混乱

Posted

技术标签:

【中文标题】Python将图像拆分为帧,颜色混乱【英文标题】:Python split image into frames, messes with colors 【发布时间】:2020-06-29 20:08:47 【问题描述】:

我正在编写一个循环遍历几个目录的脚本,找到该目录中的所有 gif,将它们拆分为单独的 png 帧图像,然后将它们写入一个目录。

实际的分割效果很好,但是除了第一帧之外的所有帧都搞砸了。根据我的研究,我了解一些 gif,而不是存储所有单独的帧,只存储帧之间的变化,我猜这是基于我得到的输出的情况之一。

这是我正在使用的代码:

from PIL import Image
from os import listdir
import os
from os.path import isfile, join

characterDirs = ["01_mario"]
print(characterDirs)

#Loop through characterDirs
for char in characterDirs:

    #save each gif into a directory for easy access
    moves = [f for f in listdir("./media/gifs/" + char)]

    #Make a directory for that character
    os.mkdir("./media/frames/" + char)

    #Loop through all moves in the array
    for move in moves:
        print(move)
        i=0

        #Open the gif
        gif = Image.open("./media/gifs/" + char + "/" + move)

        #Make a directory for the move
        os.mkdir("./media/frames/" + char + "/" + move[0:-4])

        #Keep going until there are no remaining frames of the gif
        while True:
            try:

                #Save the frame
                gif.save("./media/frames/" + char + "/" + move[0:-4] + "/" + str(i+1) + ".png")

                #Increment to next frame
                gif.seek(gif.tell()+1)
                i +=1
            except EOFError:
                break

这是我得到的一些帧:

https://ultimate-hitboxes.s3.amazonaws.com/***/10.png

(可以将url中的10改成1-33之间的任意数字来获取每一个断帧)

这是完整的 gif:

https://ultimate-hitboxes.s3.amazonaws.com/***/MarioBAir.gif

提前致谢!

【问题讨论】:

【参考方案1】:

尝试像这样在终端中使用 ImageMagick

convert MarioBAir.gif -coalesce frame-%02d.png

这将为您提供 33 个单独的帧:

文件名是:

-rw-r--r--     1 root  staff     30873 18 Mar 17:45 frame-00.png
-rw-r--r--     1 root  staff     31971 18 Mar 17:45 frame-01.png
-rw-r--r--     1 root  staff     75743 18 Mar 17:45 frame-02.png
-rw-r--r--     1 root  staff     73075 18 Mar 17:45 frame-03.png
-rw-r--r--     1 root  staff     34927 18 Mar 17:45 frame-04.png
-rw-r--r--     1 root  staff     35757 18 Mar 17:45 frame-05.png
...
...
-rw-r--r--     1 root  staff     72723 18 Mar 17:45 frame-31.png
-rw-r--r--     1 root  staff     72103 18 Mar 17:45 frame-32.png

如果你使用 v7 ImageMagick,命令变为:

magick MarioBAir.gif -coalesce frame-%02d.png

【讨论】:

我必须对数百个 gif 图像执行此操作,有没有一种方法可以轻松地一次性对所有 gif 执行此操作? 是的,如果您使用的是体面的操作系统(Linux 或 macOS)... 我对 Windows 帮不上什么忙。 能够使用 Python 脚本在 Windows 中执行魔法命令。谢谢! 酷,我知道你要求 Python,但这似乎容易多了。顺便说一下,ImageMagick 有一个 Python 绑定,称为 wand docs.wand-py.org/en/0.5.9。

以上是关于Python将图像拆分为帧,颜色混乱的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 OpenCV 中的图像是不是为 RGB?

如何为 Network.framework 编写 NWProtocolFramer,使用分隔符将流拆分为帧?

openCV-python(六)图像操作——通道拆分与合并

COLOR_ATTACHMENT's - 如何将多个纹理渲染为帧缓冲区对象内的颜色附件?

在python中旋转图像:外推背景颜色

Python学习笔记 - 使用Python进行图像颜色量化