找回密码
 注册
关于网站域名变更的通知
查看: 670|回复: 1
打印 上一主题 下一主题

学习用matlab制作GIF动画(png转gif)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-16 16:44 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
目标:将三幅图(png格式)制作成GIF: E+ @8 p. P% g$ k3 J
- I0 I: T3 E( T9 ~  R
准备材料:三幅png格式的图
$ B( z$ g6 L. ]- ~7 q! W) n( }7 ?2 b1 w3 \

4 C) A; c; e) T$ n! S4 V
; d* ~9 J/ W( u4 ~gif展现一个动态由悲到喜的过程, c& B2 L0 A1 U' l- O
& u* s( r  u- q" {' K  q1 M3 B
实现代码:/ F: Q" z: p8 M0 @/ q$ g
$ T! _0 ]4 q0 L  |
`%预定义变量
  T9 J5 y9 B! Z2 `2 n- }, vPicture_save = {0};                                                        % i% a+ z/ P. L' Q3 m" U
%初始化提高效率
3 U- k+ v* U" X7 Kfilename = 'myGIF.gif';
% |2 S2 J% A+ ^1 a+ T7 B& n6 @5 n% A. u. O' F$ f; L7 h/ t

4 P  R$ X2 c7 S) e' Q  Y%图像获取,图像类型转换) I% @5 V  O8 G5 U
[P1, map]  = imread('1.png');     2 S+ D7 S( y2 j# D" {4 u  s# B
picture1 = ind2rgb(P1,map);                                                
  U/ b  D# v  r%索引图必须转换为真彩图,否则颜色不对2 V6 i, j5 ~7 p) U) x
[P2, map]  = imread('2.png');8 x) e8 b1 F) F, u2 |1 S2 [
picture2 = ind2rgb(P2,map);
0 q" |9 ?: Q; k- `+ {0 }[P3, map]  = imread('3.png');" c  \% w  R# U7 b* y" y
picture3 = ind2rgb(P3,map);0 f2 K0 M& M0 W* F7 v

' r8 u8 F7 N  |2 U/ uarray = [{picture1}, {picture2} ,{picture3}];                              : x( _9 R+ a: U4 S
%方便循环  3 H! @" S+ d" F; v: _) c3 K
  v: Z% ?) g& Q
%保留帧数据8 q1 E+ [% M' T3 J$ {5 h! z
for idx = 1:3
8 ^8 x  y2 S' T2 z) u9 I    figure(idx)/ z+ Y% M# J8 Y! B6 w
    imshow(array{idx});                                                    ! B6 F9 I! I7 c% B; b% U
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     
2 @- j8 a3 p  v5 v    Picture_save{idx} = frame2im(getframe(idx));                           6 _& j: }0 k9 i6 j3 S! z
    %获取figure(idx)展示的效果,将其以图片数据保存
$ ?# a" O1 y1 }    close all8 E! E) T+ g7 `( M
end3 |3 L! }0 [! t6 G9 R$ E8 |( Z

% `$ d9 Y1 T# m%制作GIF
1 m6 I: ~. q% C3 W; t  W  e5 a. L%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了
) w  n. a* j! ]6 U  j0 ?6 q/ n- pfor idx = 1:32 l8 K/ K, U5 ?3 y: N) \
    [A,map] = rgb2ind(Picture_save{idx},256);                              
" Y( k8 F! g8 ^0 ^$ j$ n( V; F    %imwrite不能显示三维图像,所以要进行转换) W5 {7 V6 N% `3 i% i
    if idx == 1
7 {9 L7 ~1 S( ^3 J: W        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);   
; _5 r& s- a" O         %Inf 无限循环# Z8 y( a3 O9 |& M
    else
' j% E; j9 ^5 z6 D" \        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);4 B7 n- \  K# M
    end
* }9 C  ^# K5 i. [$ k6 Bend+ h. V! _$ j0 L7 z1 O8 l

$ R; y% X& {9 f# F; |close all`
3 @# _: f. {, Y% I' K4 ~
  }8 v1 q/ @( r- e. H
8 h# F; W" @& d, \# k( m以下是代码的截图
1 Z, p( X' b$ W* a
# A+ N9 Z& R3 g ' @* @6 z' g9 `& h  n1 i5 {

6 c3 h+ b* y4 T4 T* ~6 X当然了,还有更简单的办法:
1 u# y6 {$ T! N' z* r" U& w. b! q3 F$ I0 ?: v
for idx = 1:3
5 Y. N- z% t1 }2 O    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换$ o' S$ u3 ?2 ^" o
    if idx == 1
$ Y- S3 \" N( G! @        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环( E& G7 S  {' @/ G
    else
3 g0 i5 b9 h+ I- Q        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);, x- O2 S9 r4 G
    end: X. U* V: h% |. L3 ]" B* Z- U$ C; H
end
% U& \2 T4 a+ Z+ z; d7 P9 Z6 z- X& t, |3 N4 E9 `

3 |$ p5 w2 k9 @7 M; X  f关于代码有遇到别的问题,或者有改进意见,欢迎评论。
# x* N4 K2 t+ [  F* {: j
6 p$ K  g% n* g; c1 N) r. _在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。' b" y; C  O6 E4 M/ `8 M$ N3 y9 A% c' Y

0 ]  s- n9 w# U  ?% Y
% \" q9 j* Y& U+ c4 h- {" l( E1 \% b1 i
% `. ]3 K3 T  r" O
6 V6 o- P! o6 Z( h
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-6-16 18:32 | 只看该作者
    用matlab制作GIF动画
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 22:14 , Processed in 0.171875 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表