欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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

效果图:
【MATLAB编程实例练习】-(20)动态画出心形图案并保存gif动图
X数据:
【MATLAB编程实例练习】-(20)动态画出心形图案并保存gif动图
Y数据:
【MATLAB编程实例练习】-(20)动态画出心形图案并保存gif动图