如何逐帧查看动画 GIF / PNG,或放慢速度
How to view an animated GIF / PNG frame by frame, or slow it down
有没有办法逐步查看动画 GIF 演示?使用 Blender screencast 生成的动画图像示例太快了:
来源:What is the fastest way to create a curved plane? Blender.SE。
我自己搜索不成功:
- Blender.SE 上的 existing answer 建议在 GIMP 中查看动画图像。像OP一样,我认为这不是一种方便的方法!
- Chrome (GIF Scrubber) 有一个插件,但我没有找到 Firefox 的插件。
- 有一项在线服务可以获取 GIF 并添加适当的控件:此 same GIF converted.
问题:有没有:
- 为动画图像添加播放控件的 Firefox 插件?
- 还是一个独立的工具?
这个怎么样?
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?
如果您想逐帧查看 gif -
此网站允许您上传图片或粘贴图片urlhttps://ezgif.com/split
在尝试为 Conway 的人生游戏构建测试时,它对我很有帮助。
最后我写了一些 Python 代码来在 Jupyter notebook 中显示 Gif。
我使用这些库:
IpyWidgets
和 IPython.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())
Reader class:
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
您可以使用免费的开源工具ScreenToGif
它包含一个非常简洁的编辑器,允许您单独查看帧。使用箭头导航它们,如果您愿意,甚至可以更改单个帧(或一次更改所有帧)的持续时间。
有没有办法逐步查看动画 GIF 演示?使用 Blender screencast 生成的动画图像示例太快了:
来源:What is the fastest way to create a curved plane? Blender.SE。
我自己搜索不成功: - Blender.SE 上的 existing answer 建议在 GIMP 中查看动画图像。像OP一样,我认为这不是一种方便的方法! - Chrome (GIF Scrubber) 有一个插件,但我没有找到 Firefox 的插件。 - 有一项在线服务可以获取 GIF 并添加适当的控件:此 same GIF converted.
问题:有没有:
- 为动画图像添加播放控件的 Firefox 插件?
- 还是一个独立的工具?
这个怎么样?
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?
如果您想逐帧查看 gif -
此网站允许您上传图片或粘贴图片urlhttps://ezgif.com/split
在尝试为 Conway 的人生游戏构建测试时,它对我很有帮助。
最后我写了一些 Python 代码来在 Jupyter notebook 中显示 Gif。
我使用这些库:
IpyWidgets
和IPython.display.HTML
对于 UIMatplotlib.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())
Reader class:
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
您可以使用免费的开源工具ScreenToGif
它包含一个非常简洁的编辑器,允许您单独查看帧。使用箭头导航它们,如果您愿意,甚至可以更改单个帧(或一次更改所有帧)的持续时间。