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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目标:将三幅图(png格式)制作成GIF
3 D5 c" o. b6 Q0 O; m  K* n6 v
/ j- q4 d1 r" J4 }) D准备材料:三幅png格式的图
1 f* K2 K8 q( @; H# j% _  E/ {/ x, Z
* L. E  F( ]% @& Q2 d# y
7 O7 D; j+ z9 b$ ]7 r* e% ^- C& V. V0 P; V* \
gif展现一个动态由悲到喜的过程
1 G5 B" a: q* \. G4 G. N) }0 ]9 w! c' k" o4 q: {! y' b- r
实现代码:: S; {  a$ R" s5 J

! U+ c+ {; K5 W1 w0 ?* R`%预定义变量
% W) g  o; S- y, ]% k# K6 lPicture_save = {0};                                                        8 Z5 E' u: a, K) h/ b3 _% s& g
%初始化提高效率
4 S7 N5 `5 ^8 y" Z! H. b8 b3 afilename = 'myGIF.gif';
- O& I3 a& H* Q) M! O3 K+ A6 O  `" _) R) ?" {
' B4 U. N5 T5 F3 V" W5 {
%图像获取,图像类型转换
" k, y7 Z/ V/ C$ K. u5 f& E; S[P1, map]  = imread('1.png');     " l% e/ Z+ P7 b) }% N
picture1 = ind2rgb(P1,map);                                                # G0 Q2 u( F% d0 t  ~3 G
%索引图必须转换为真彩图,否则颜色不对
" C" ?% g: @: J* V[P2, map]  = imread('2.png');; a) V  G. v1 h" ^( E# s
picture2 = ind2rgb(P2,map);
& p& Q$ H' c: X4 j2 Q[P3, map]  = imread('3.png');
. a2 {* R3 A2 g# l( r; \- wpicture3 = ind2rgb(P3,map);8 i; r  q3 X' P" y$ }! o

; R2 @+ S* ^# f! U8 i6 S  barray = [{picture1}, {picture2} ,{picture3}];                              * i0 J& L  O& i4 P+ d$ D
%方便循环  , v+ g0 R$ ~5 H5 D$ z3 U. @
, v6 J/ G) ~* ~# n: L6 ^+ B
%保留帧数据
  X, P% n; D- sfor idx = 1:3
: _% m/ H! u/ V    figure(idx)* Z6 N  T8 h" }6 ]+ ]
    imshow(array{idx});                                                    7 Y6 K  ?1 v7 t
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     
. [) e# e  R" ]7 v) Z    Picture_save{idx} = frame2im(getframe(idx));                           
& ~7 N" B8 Q1 W    %获取figure(idx)展示的效果,将其以图片数据保存
4 i! w- d% Y5 O    close all
( m$ y$ Y- p- {3 rend
- h& g) g6 I# D- Q! G7 f' z6 U: e4 G, M/ h
%制作GIF
  I8 g  B1 |: r, I( ~: s: r%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了1 I: m' g8 a  ?" b9 G! j- d
for idx = 1:3
) v- t( e3 X. @$ R' u2 G# O- `3 ?    [A,map] = rgb2ind(Picture_save{idx},256);                              
& g3 R; t; Q$ e! G* c$ Z# q$ c    %imwrite不能显示三维图像,所以要进行转换/ Z9 _+ E" }, M' M
    if idx == 1
. v! ^6 T7 O1 `1 y; A        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);    3 b- z2 k' ]% C9 U
         %Inf 无限循环
) {2 |# i0 W! t; @: w) F8 p    else+ D. H* t7 K9 \2 }  `
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);
/ ^8 ^& e+ J4 I$ T5 B$ J1 |2 a    end3 C+ }9 @# x  `$ {
end
$ |/ L! n1 @! r1 P# l0 b% J7 }: v
  p! o# b/ _* f. \; uclose all`8 s/ H; b" y3 E/ G

0 V; F; c/ Z3 a9 ]0 @' m: _' e4 r' f3 J" W" H: s8 R
以下是代码的截图
  z* }/ |. _2 A1 {9 v
. {& J4 r) v( _8 H+ y
1 m7 P9 G* ?: b6 ]% G2 U+ p( o& ]
/ B0 _2 E$ u; @5 ~# L2 i当然了,还有更简单的办法:+ X6 ], o% \- m/ f
4 X% A* n* X! {; j/ C5 J& p, P7 t
for idx = 1:3
  |* t. {# P7 D% P8 w. @* A    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换
; L7 e% q1 K9 a# X, z5 u    if idx == 1% U  t: b/ e. ~* q/ ~  A
        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环0 h9 Z9 w: D' J; l
    else5 k/ E. B* m; [! m5 \) K5 D
        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);
3 B' C2 U5 N- F- T! U    end% {# Z) m- w/ o( h- g1 X/ W8 \
end& ~4 @. T7 w2 o' O* W; X, G
4 Y& ^) Q1 b% c4 J. z  Q9 p

6 V6 Z6 [& E% T3 b) G关于代码有遇到别的问题,或者有改进意见,欢迎评论。
0 F, o% \7 B  J3 J, y+ ?6 [3 x" I1 \/ b/ k; x. h
在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
/ I9 ?  ]& ~5 k# W9 U9 k# X
6 n) _: T4 K* y! L; x" q0 P0 s/ R: j4 x( z0 r: D3 y0 c3 l

' _: t5 w, {$ C8 t" M" X" G1 e, I
: k6 H7 M' {7 V* Q, P* a7 I( C
  • 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-7-25 11:00 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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