如何逐帧查看动画GIF / PNG,或减慢速度

时间:2015-07-18 15:10:40

标签: blender playback animated-gif

有没有办法逐步查看动画GIF演示?用Blender screencast生成的动画图像示例太快了:

enter image description here
来源:Blender.SE上的What is the fastest way to create a curved plane?

我自己的搜索没有成功: - Blender.SE上的existing answer建议在GIMP中查看动画图像。像OP一样,我认为不是一种方便的方法! - Chrome有一个插件(GIF Scrubber),但我找不到Firefox的插件。 - 在线服务采用GIF并添加适当的控件:same GIF converted

问题:有:

  • 一个Firefox插件,可以为动画图像添加播放控件吗?
  • 还是一个独立的工具?

4 个答案:

答案 0 :(得分:2)

这个怎么样?

  

ffmpeg -f gif -i infile.gif outfile.mp4

你可能想稍微调整一下。 资料来源:unix.stackexchange.com: How to do I convert an animated gif to an mp4 or mv4 on the command line?

答案 1 :(得分:2)

最后,我编写了一些 Python 代码来在 Jupyter 笔记本中显示 Gif。

我使用这些库:

  • IpyWidgetsIPython.display.HTML 用于 UI
  • Matplotlib.Pyplot 将帧显示为图像
  • Matplotlib.animation 动画
  • os 读取文件
  • NumPy 读取数组中的帧
  • PIL 处理图像像素

无需 Jupyter 即可轻松调整代码以工作,但笔记本是用于交互的绝佳工具:

import os
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from PIL import Image
import ipywidgets as widgets
from IPython.display import HTML

reader = GifReader('Muybridge_cavall_animat.gif')
fig,ax = plt.subplots()
ax.axis('off')
data = reader.seek(0)
h = ax.imshow(data)
plt.close()

def make_frame(n):
    data = reader.seek(n)
    h.set_data(data)
    return [h]

anim = animation.FuncAnimation(fig, make_frame,
                               frames=reader.get_length()-1,
                               blit=True)
HTML(anim.to_jshtml())

enter image description here
Original gif image

阅读器类:

class GifReader:
    pil_image = None
    length = -1

    def __init__(self, file_path):
        self._open(file_path)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()

    def _open(self, file_path):
        if self.pil_image != None:
            raise ValueError(f'File is already open')

        if os.path.isfile(file_path) == False:
            raise ValueError(f'File {file_path} doesn\'t exist')

        with open(file_path, 'rb') as f:
            if f.read(6) not in (b'GIF87a', b'GIF89a'):
                raise ValueError('Not a valid GIF file')

        self.pil_image = Image.open(file_path)        
        self.length = self.pil_image.n_frames

    def close(self):
        if self.pil_image == None: return
        self.pil_image.close()
        self.pil_image = None

    def get_length(self):
        if self.pil_image == None:
            raise ValueError('File is closed')
        return self.length

    def seek(self, n):
        if self.pil_image == None:
            raise ValueError('File is closed')
        if n >= self.length:
            raise ValueError(f'Seeking frame {n} while maximum is {self.length-1}')

        self.pil_image.seek(n)
        a = self.pil_image.convert ('RGB')
        return a

答案 2 :(得分:1)

如果要逐帧查看gif-

通过该网站,您可以上传图片或粘贴图片网址https://ezgif.com/split

当尝试为Conway的生活游戏进行测试时,这对我很有帮助。

答案 3 :(得分:1)

您可以使用免费的开源工具 ScreenToGif

它包含一个非常简洁的编辑器,允许您单独查看框架。使用箭头导航它们,甚至可以根据需要更改单个帧的持续时间。