Python разделить изображение на рамки, смешивать с цветами - PullRequest
1 голос
/ 18 марта 2020

Я работаю над сценарием, который просматривает несколько каталогов, находит все картинки в этом каталоге, разбивает их на отдельные изображения кадров 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/stackoverflow/10.png

(Вы можете изменить 10 в URL-адресе для любого числа от 1 до 33, чтобы получить каждый разбитый кадр)

Вот полный рисунок:

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

Заранее спасибо!

1 Ответ

1 голос
/ 18 марта 2020

Попробуйте просто использовать ImageMagick в терминале следующим образом:

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

Это даст вам 33 отдельных кадра:

enter image description here

Имена файлов:

-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
...