贡献者: addis
这里给出一个 Matlab 代码 im2gif.m
,通过选中文件夹中的多个图片来生成 gif 动画1。运行程序后,会弹出文件窗口提示用户选择多张图片,图片会按照文件名排序。选择以后,为了减小 gif 的大小,每张图片在读取之后将会把颜色划分为指定的个数 Ncolor
,选中图片越多,颜色数越多,gif 的文件就越大。然后程序以指定的文件名生成 gif 文件,gif 的每一帧间隔为 dt
秒。
function im2gif()
% === 参数 =====
fname = 'animation.gif'; % 文件名
Ncolor = 64; % 颜色数(最大 256)
dt = 0.1; % 间隔时间(秒)
dt_beg = 0; % 第一帧时间(秒)
dt_end = 1; % 最后一帧时间(秒)
% ================
[filename,path] = uigetfile('*.*', 'multiselect', 'on');
filename = sort(filename);
cd(path);
I = imread(filename{1});
[X,cmap] = rgb2ind(I,Ncolor,'nodither');
imwrite(X, cmap, fname, 'gif', 'Loopcount', inf, 'DelayTime', dt_beg);
figure;
N = numel(filename);
for ii = 2:N
if strcmp(filename{ii}, fname)
continue;
end
I = imread(filename{ii});
[X,cmap] = rgb2ind(I,Ncolor,'nodither');
imshow(X, cmap); drawnow;
if ii == N
dt = dt_end;
end
imwrite(X, cmap, fname, 'gif', 'WriteMode', ....
'append', 'DelayTime', dt);
end
end
要用 Matlab 制作一个完整的动画,例如这个演示数列极限的动画,代码如下,可以先写一个程序画好每一帧后用 saveas()
函数自动保存为 1.png
,2.png
, 等,共 60 张图,如图 1 。
然后再手动运行上面的 im2gif.m
,选择生成的 60 张图,就会自动生成文件 animation.gif
。
% 数列极限的动画演示
close all;
A = 1;
n = 1:40;
an = (-1).^(n+6) ./(n+6).^1.2 + A;
figure;
set(gcf, 'units', 'pixels', 'outerposition', [200 200 800 400]);
epsilon = linspace(0.06, 0.03, 60);
plot(n, an);
axis([0, n(end), -0.1+A, 0.1+A]);
xlabel n; ylabel a_n;
set(gca, 'FontSize', 14);
hold on;
k = 0;
for eps = epsilon
k = k + 1;
hf = fill([0, 1, 1, 0]*n(end), [-1, -1, 1, 1]*eps+A, ....
[233,30,99]/255, 'FaceAlpha', 0.1, 'EdgeColor', 'none');
m1 = abs(an - A) > eps;
m2 = ~m1;
hs1 = scatter(n(m1), an(m1), 'marker', 'o', 'SizeData', 30,....
'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'b');
hs2 = scatter(n(m2), an(m2), 'marker', 'o', 'SizeData', 30,....
'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'r');
ht = text(find(m2,1), eps + A + 0.02, ....
['n > ' num2str(find(m2,1)-1)], 'FontSize', 14);
ht2 = text(28, eps + A + 0.02, ....
['|a_n - ' num2str(A) '| < ' num2str(eps, '%4.3f')], 'FontSize', 14);
% pause(0.1);
saveas(gcf, [num2str(k) '.png']);
delete(hf); delete(hs1); delete(hs2);
delete(ht); delete(ht2);
end
1. ^ 网上也有一些开源软件可以完成该任务,如 GiftedMotion(需要先安装 java)。