前言
在做工作汇报的时候,经常需要插入一些视频或者图片,但是有时我们想让视频能够自动播放,这时就需要gif格式的图片了,有什么办法能够方便制作呢,最近一直在寻找这样的办法,果然万能的MATLAB很OK,话不多说,上代码。
1、导入视频
首先导入视频,具体可用下面的代码来实现:
[filename1, pathname1] = uigetfile({'*.mp4';'*.avi';'*.*'},'File Selector'); % 获取MP4或者Avi格式的视频文件路径以及名称
V=VideoReader([pathname1,filename1]); % 读取视频
2、分析视频文件
在导入视频后我们就可以在matlab的工作区(Work Space)看到名字为video的一个数据,双击点开后可以看到它有如下图所示的一些属性

有一些视频的重要信息,如Duration (视频的时长)、FrameRate(帧率,即美妙多少帧)、视频大小以及格式等等。由于版本的原因,其实还有一些其它的数据,比如总帧数NumberOfFrames(其实就相当于总时长乘以帧率),这个里面虽然没有显示出来,但是我们依然可以调用。然后我们就来读取视频的总帧数和帧率。
numFrames = video.NumFrames; % 获取视频帧的总数
Framerate=video.FrameRate; % 获取视频帧率
3.生成gif文件
最后就是来生成gif文件啦,这个我以前的文章中有过类似代码,我这里就直接把生成文章开头的那个gif动画的那段这里的代码发出来。
bar = waitbar(0,'Please wait...'); % 设置进度条
start_time = 0; % 开始时间
end_time = 5; % 结束时间
if end_time>video.Duration
end_time=video.Duration;
end
start_frame=round(Framerate*start_time)+1; % 开始帧数
end_frame=round(Framerate*end_time); % 结束帧数
for i=start_frame:2:end_frame
frame=read(video,i); %读取第k帧画面
% frame=imresize(frame,0.5); % 将图像缩小0.5倍
% im=frame2im(frame); % 从单个影片帧frame返回真彩色 (RGB) 图像
% 制作gif文件,图像必须是index索引图像,只能用256色
[I,map]=rgb2ind(frame,256); % 将RGB图像frame转换为索引图像I,map为关联颜色图
% I=rgb2gray(frame);
waitbar((i-start_frame)/(end_frame-start_frame),bar,['转换中',num2str(round((i-start_frame)*100/(end_frame-start_frame))),'%']);
if i==start_frame
% 第一张直接保存到视频目录下
imwrite(I,map,strcat(pathname1,filename1(1:end-4),'0.gif'),'gif','Loopcount',inf,'DelayTime',0.067);
else
% 剩下的每张图续接上一个图,每张图间隔为与视频中的一致(0.067s,帧率为30)
imwrite(I,map,strcat(pathname1,filename1(1:end-4),'0.gif'),'gif','WriteMode','Append','DelayTime',0.067);
end
end
waitbar(1,bar,'finished');
close(bar);

总结
结束后能在原来视频的目录下面找到和视频名字相同的gif文件。可以通过上面的代码调节每个图像的时间间隔(delaytime)或者写入gif文件中的图像的数量,从而能改变动画显示的速度,或者截取视频中的某一段做成gif文件。理论上delay时间可以设为0,最终的播放速度取决于硬件的好坏。
原文网址:https://kknews.cc/news/yge4pxg.html