zyazky 2020-04-25
使用matlab制作一个n帧的gif动画 示意程序
for i = 1:nFrames % draw stuff frame = getframe(gcf); img = frame2im(frame); [img,cmap] = rgb2ind(img,256); if i == 1 imwrite(img,cmap,‘animation.gif‘,‘gif‘,‘LoopCount‘,Inf,‘DelayTime‘,1); else imwrite(img,cmap,‘animation.gif‘,‘gif‘,‘WriteMode‘,‘append‘,‘DelayTime‘,1); end end
Step1:捕获当前图窗并生成索引图像
frame=getframe(gcf)是捕获当前图窗作为影片帧,frame是一个结构体,包含cdata和colormap
cdata是一个存放真彩色图像数据的矩阵,大小为M*N*3
当cdata存放真彩色图像时,colormap=[]
img=frame2im(frame)是将捕获的影片帧转换为图像数据,img为真彩色图像,即从结构体frame中提取出的cdata
因为 不支持将真彩图像写入GIF文件,所以应调用 rgb2ind, 将图像中的 RGB 真彩图像数据转换为索引图像
[X,cmap] = rgb2ind(RGB,Q) 使用具有 Q 种量化颜色的最小方差量化法并加入抖动,将 RGB 图像转换为索引图像 X,关联颜色图为 cmap。
索引图象X矩阵大小为M*N
Step2:调用imwrite函数将索引图像写入gif文件中
语法:imwrite(索引图象,索引图象颜色图,‘gif文件名‘,‘gif‘,名称-值对组参数)
名称-值对组参数
指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数
以下是本程序使用到的名称-值对组参数
‘DelayTime‘ - 显示下一个图像之前的时滞
显示下一个图像之前的时滞(秒),指定为逗号分隔的对组,包含 ‘DelayTime‘ 和范围 [0,655] 内的标量值。0 的值以硬件允许的最快速度显示图像
‘LoopCount‘ - 重复动画的次数
重复动画的次数,指定为以逗号分隔的对组,包含 ‘LoopCount‘ 和 [0,65535] 范围内的整数或 Inf 值。如果指定 0,动画将播放一次。如果指定值 1,动画将播放两次,以此类推。Inf 的 LoopCount 值可使动画连续循环
‘WriteMode‘ - 写入模式
写入模式,指定为逗号分隔的对组,包含 ‘WriteMode‘ 和 ‘overwrite‘ 或 ‘append‘。在 overwrite 模式下,imwrite 覆盖现有文件 filename。在 append 模式下,imwrite 会向现有文件添加单个帧。
相关知识:
MATLAB有三种基本的图像类型:
Truecolor(真彩色图像)——数码相机的格式,广泛用于计算机图形。
Indexed (索引图象)和 scaled indexed (比例索引图象)——经常用来显示科学或者工程数据
真彩色图像
在这种格式的图里,每一个像素由三个数字表示:红,绿,蓝,整个图形由一个M-N-3的三维矩阵表达。图形显示函数和图形处理工具箱将这种矩阵视为一个truecolor图形
矩阵值直接指定了每一个像素的颜色。通过这种表达方式你可以很大程度上控制颜色显示,但是对于工程应用来说它并不是最适合的一种图形格式。
索引图像
为了解决彩色图像消耗空间大的问题,一般应用于色彩构成比较简单的场景,索引图像包括一个数据矩阵X,一个颜色映像矩阵Map。像素颜色由数据矩阵X作为索引指向矩阵Map进行索引。