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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目标:将三幅图(png格式)制作成GIF1 C, Y  r( E+ C6 O2 o
" P3 Y4 U6 w" @
准备材料:三幅png格式的图
: O7 r" B: m! [7 y5 a, l6 Z4 F. q- J" @- Q! S  _7 ?( d1 L: n7 }
* B) c7 b$ \# _+ d: e6 A7 h% r

  @0 }5 O, f. ]& h! egif展现一个动态由悲到喜的过程
3 |: \9 I* R5 T& n  o8 [( o4 K+ Q, K, i2 G8 [0 S/ D$ E
实现代码:
" x: ?: X! w% w( d9 x
5 s6 C2 N1 O+ X+ C6 D`%预定义变量
  S$ n# A, ^9 e% k8 F+ Q) Q  @$ ?6 VPicture_save = {0};                                                        + c( ^' N1 t# e9 w& n. o0 j. P
%初始化提高效率5 D6 ?. T6 F: m* W
filename = 'myGIF.gif';  w0 {3 h  s% f$ C; E7 L/ p

0 r5 b4 `( T2 q5 E3 Y7 C7 z' @$ N1 P6 n6 k+ C
%图像获取,图像类型转换
7 A. \7 T# v: d8 K6 }; n[P1, map]  = imread('1.png');     + C, V0 V) W& U, g6 i4 _* l( ?
picture1 = ind2rgb(P1,map);                                                + H6 o, H$ k4 X% r
%索引图必须转换为真彩图,否则颜色不对
7 a" J0 f9 C: s. v9 |6 p8 H[P2, map]  = imread('2.png');5 Y' O$ s: b3 U3 u8 v* M* Y# P  o+ R
picture2 = ind2rgb(P2,map);& k" u# v, _1 ^( E
[P3, map]  = imread('3.png');
2 |8 _# s6 }' S) v4 |picture3 = ind2rgb(P3,map);
! w. N2 d' q9 n; j; \5 B5 y) e. s" {2 P8 {* m
array = [{picture1}, {picture2} ,{picture3}];                              
9 w& z- N# e. L* V( O%方便循环  
% u' B! [% R, \7 o9 n
8 u) _3 }8 f9 ~%保留帧数据2 _8 G' u3 C) [, _
for idx = 1:3
+ C& q5 f1 a& p    figure(idx)
7 C+ x: N% D5 O9 w# H5 B. P0 Q    imshow(array{idx});                                                    . j: ^1 z" _' D' D
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     
4 T; l% P3 A: T  J/ Z    Picture_save{idx} = frame2im(getframe(idx));                           
0 f9 ^6 R- i. o: B- ]# a    %获取figure(idx)展示的效果,将其以图片数据保存
# `3 G, b0 n2 d9 W    close all7 N& T: ?' s$ Y  Q, X& M; b
end0 `9 N8 J2 v! J' F# r' v
# |* e: g8 o) w7 ?: V- P5 ]# h( j
%制作GIF
# c$ l. [+ n1 \%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了$ h3 q3 y% n. r9 E, T3 R# t1 l
for idx = 1:3! t) W( R) g" C+ a: T
    [A,map] = rgb2ind(Picture_save{idx},256);                              4 U! t. N# M1 I7 l! @3 a
    %imwrite不能显示三维图像,所以要进行转换
' S1 u* O! y2 K" Y    if idx == 1
" E% I  k. D2 n4 ~7 B        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);    2 r( A7 b7 \7 ~7 _5 E3 ?# k$ L
         %Inf 无限循环
3 m* R6 A* ~5 B, g    else4 B4 `) d$ R) q% G
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);
7 e* m' M$ b. N+ ?0 |    end/ `( z" M  i! `% o: s
end9 }; p5 \' }5 d% e

  c! g8 y: i* |* |1 S' @5 ]close all`' A8 D2 J5 q4 o- j& j
1 b, G5 G% j" r# f3 i7 C2 T, N
; h, s% D& W( _' S0 k3 Y7 N
以下是代码的截图
4 P% p; v& k  E0 o6 F8 }  z* Z' h5 _0 d
7 K4 y6 ?7 u$ e% {) i8 w1 Y
" {* x& Y% z' ^# L! L( k. k  a
当然了,还有更简单的办法:2 j+ H8 @0 x, k5 E1 C9 n( M
# e& f# g7 X, i  A% f* U8 Y  D
for idx = 1:39 w! ]5 o5 U  x2 g
    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换& T) O8 w) i9 L+ g5 V) x
    if idx == 1
7 k0 M+ w  M7 n& Y7 r        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环( x: K/ S; Y/ X1 T# ]" |. Z8 `
    else
( v6 S5 w9 d- e( t        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);* ~0 O% t( W$ b- Y: _. R
    end- V9 v8 M+ F! L7 _
end
+ n$ X8 o6 i7 i( \& b& g( L" T( w# B: W* q  ^" ]8 H

& K1 n, Q- U5 C2 P) p4 c$ z; @关于代码有遇到别的问题,或者有改进意见,欢迎评论。
3 P/ Y. W: J9 V) ]# |; ^/ v! K5 E: n% l1 i! f1 ]- y. c
在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
' Q3 F/ f  a- k8 @- N* b! L* x/ L) ?7 `

5 l# F+ d  i0 ~7 M6 Q& l0 `
4 }8 I7 H# s1 e( G
- W+ i( m, ^& K7 h8 p- g- ^' f) d5 \- Q: S6 c0 A( q. p; g- X+ O- r' b
  • 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 10:15 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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