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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目标:将三幅图(png格式)制作成GIF
: Y1 \: L3 j. w0 g: ?* \
: P- Q) A5 ^' t准备材料:三幅png格式的图- a8 i. Y! d8 s1 b2 ^- `% K

/ V) ?* V. k, e! Z
) @' B/ G( G0 V* n3 P& R0 z$ _: i8 D! }  P
gif展现一个动态由悲到喜的过程& {9 h! Z  e- k  Q, A  \
7 U, f0 ~" }1 U* Q; k
实现代码:1 |; [) ]8 i* L: D# s2 v4 i

" y" D( D; A4 e6 l' X`%预定义变量
5 J8 j/ N9 m0 p) \4 F5 YPicture_save = {0};                                                        
0 B8 d3 G3 C* v' L%初始化提高效率
/ i" h1 R$ N' rfilename = 'myGIF.gif';. K- S% Z0 y6 z. g

. S% s6 V$ V( S8 w, x0 m, a; W* x% o7 H# M3 X; Q: j8 h) p% m9 f6 P
%图像获取,图像类型转换
' ]- Z* _) X5 {" _$ U5 P  ]1 Z[P1, map]  = imread('1.png');     
- i0 S; a3 b9 p. Dpicture1 = ind2rgb(P1,map);                                                0 Q# r. l/ A5 h# w' o1 m
%索引图必须转换为真彩图,否则颜色不对* B+ w! W+ o; M# l* N8 _0 R( {
[P2, map]  = imread('2.png');% D% f# P( T& }7 V
picture2 = ind2rgb(P2,map);
2 ]( A" Y& u$ t1 |- G. h5 o[P3, map]  = imread('3.png');2 B/ k- f  F( v( u) W! m2 P8 V
picture3 = ind2rgb(P3,map);3 d7 D) B' r5 i% y! [

7 m) |  T/ ^! I% `/ D% yarray = [{picture1}, {picture2} ,{picture3}];                              
4 F+ P9 x  R* d5 B& N' ~%方便循环  2 x# @  p$ o: U7 @; G6 y
. k  L: i# U7 s- N( x$ K
%保留帧数据% q- y, Q/ T; o$ q! z
for idx = 1:3
! y# Q& d) T& h: A    figure(idx); g: @/ [2 l- s8 z4 c- r) \
    imshow(array{idx});                                                    & s* P7 X2 }9 _9 g, A$ N0 Z
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     
  }* W' {) W# Y5 |: K4 x1 O    Picture_save{idx} = frame2im(getframe(idx));                           
; j& v6 E$ t0 E9 E* e" Q    %获取figure(idx)展示的效果,将其以图片数据保存2 A9 `$ x0 e: |# w( s3 m; o
    close all$ W' X( ?% p/ ^9 l9 E
end5 Q1 n6 @, o  y$ D3 ~
6 U3 i5 B/ P, O  ~/ q# X
%制作GIF- U5 M& G; t/ y& V4 Q
%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了
( a: M& o3 a2 Xfor idx = 1:33 K; o( A, g& @2 Z$ o3 @" |% X, `
    [A,map] = rgb2ind(Picture_save{idx},256);                              
7 M" ~( k. p3 A" w    %imwrite不能显示三维图像,所以要进行转换7 x" P8 q; t, m  H( ^( R
    if idx == 1
* V" \7 \) R# }& z        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);    . x0 h/ @  ^- }
         %Inf 无限循环. B, a  q2 |9 O, }" G3 v
    else4 {/ ^0 e* k! r$ J1 ?% k, L
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);
; n* T- x; b1 M7 y$ C" C( B    end
, P0 p* L% a6 @' ]* U- V. Iend) R9 s. j9 R/ Q5 ?* q

8 {5 q% O1 U: {+ {( w+ I: Hclose all`
) N+ B- g: [; e) E% Z4 O
. a5 n" u2 i" }: E
5 o# x) Z6 _) [# Q9 U以下是代码的截图
7 ?# B: ]2 ]9 {2 n
8 U# `5 `0 x9 C0 q, ^. X) x1 z
5 I5 D6 @! t' V* [: E3 i; O2 ~6 _* J( W$ ?, K7 M# L
当然了,还有更简单的办法:
  }* `  L- l/ K  B! C
  t) i& p$ |# [4 |% I3 Y( Wfor idx = 1:3
1 d. C; \' v5 J    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换% m9 r  _* @6 H) {3 v. q
    if idx == 15 j! Q4 a3 j# T
        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环
, H+ \7 O! k4 M' m    else
( F! `; {) j5 S' h7 N2 q        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);# Q0 H6 T+ J- M( e, b5 S$ b
    end
2 a/ x% U- m3 s% Rend
+ S7 C' e- `9 C
, v4 h  g/ J& j) n- Z- Z# ?) U1 ~" P% L4 }" m9 C" X" Y- j
关于代码有遇到别的问题,或者有改进意见,欢迎评论。! D: y+ ]) _, o6 D' _

) G- M+ j$ p9 m, d6 T在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
! M- `$ u  x& U0 b/ b! W# d- N2 }7 a+ }2 u

; x. X5 d5 W: e$ ^! D  q6 M
5 v# h) C5 R8 S+ H8 J+ ]+ T9 s6 ~5 ~9 b! X) T+ r8 [

/ S& c+ S# t' S
  • 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-5 13:04 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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