【MATLAB编程实例练习】-(20)动态画出心形图案并保存gif动图
程序员文章站
2022-07-12 22:43:45
...
步骤:
(1)生成心形曲线数据,根据小红心的大小从曲线数据中提取适当个数的数据点,作为放置小红心位置的定位点(注:测试发现提取数据点过密的情况下,会导致相互重叠的小红心无法显示,哪位懂得解决方法请告知下,谢谢),保存下来;
(2) imread读取小红心图片;
(3)使用mapminmax将提取的小红心定位点的横纵坐标归一化到画布;
(4)设置画布格式;
(5)使用for循环画出小红心,将每个小虹心保存在emo_love.gif里。
代码如下:
load('EMO_LOVE.mat');
img = imread('emo2.jpg');%读取小红心图片
%X和Y为心形曲线的点坐标
%使用mapminmax归一化到画布,画布长度为0~1,高度为0~1;这里稍微缩小了,以防图片溢出画布
[Y_norm,PS_Y] = mapminmax(Y, 0.05,0.9);
[X_norm,PS_X] = mapminmax(X, 0.05,0.9);
%将画布背景设为白色
set(0,'defaultfigurecolor','w')
%设置画布位置,大小
set(gcf,'unit','centimeters','position',[7,1,20,15])
pic_num = 1;
for i=1:21
subplot('position',[X_norm(i),Y_norm(i),0.06,0.06]);%设置每个小红心的坐标及大小
imshow(img);%画出小红心
pause(0.4);%等待
F=getframe(gcf);% 获取整个画布上的图像
I=frame2im(F);
[I,map]=rgb2ind(I,256);%将RGB图像转换为索引图像
%参考MATLAB文档中关于imwrite的用法
if pic_num == 1
imwrite(I,map,'emo_love.gif','gif','Loopcount',inf,'DelayTime',0.5);
else
imwrite(I,map,'emo_love.gif','gif','WriteMode','append','DelayTime',0.5);
end
pic_num = pic_num + 1;
end
效果图:
X数据:
Y数据: