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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目标:将三幅图(png格式)制作成GIF
5 t- @" ?/ F$ V# @5 f! K* T9 |3 `& Q8 m# J0 @. i
准备材料:三幅png格式的图
- [2 G* v; Y6 C4 r! [: ^+ I: z3 ~9 N9 L- Q% ^+ M
* {1 [: p$ ^* ~5 g" }: H8 |

( `" I5 M$ }1 N5 s; @1 hgif展现一个动态由悲到喜的过程/ z9 I3 W2 O3 e4 E0 R- f

9 D+ ]! g3 K+ Z3 S" @3 k4 o1 L实现代码:
& e( L# k. K3 S
( z$ x* P# d; G9 G' @`%预定义变量
; _9 \7 S3 I+ {$ Q# }Picture_save = {0};                                                        # H+ r$ C# f  O8 O* I! d. Y! H
%初始化提高效率
) I4 v9 I% j: c7 Z. }filename = 'myGIF.gif';
/ i  J! l9 P3 j+ X* ~& j8 T& h
! j0 m$ c2 k3 x
6 x3 \7 h) p% C- x4 H5 n  b%图像获取,图像类型转换* \% ^* `8 {: E8 S& O; Q
[P1, map]  = imread('1.png');     - G* ~1 e8 p! c
picture1 = ind2rgb(P1,map);                                                
/ E+ ]% g8 [8 N; F3 P$ \) s: Q2 `%索引图必须转换为真彩图,否则颜色不对) J1 G6 |3 V( ~3 U
[P2, map]  = imread('2.png');  [- L6 x. ]( B5 S- H6 f
picture2 = ind2rgb(P2,map);/ J0 ]9 c9 z- F$ A( ?# r8 z( j7 n
[P3, map]  = imread('3.png');
5 B) ?3 S" R* upicture3 = ind2rgb(P3,map);
) L) e- _/ h0 ]" T# T- F$ I: K* d  C3 a: Y+ U3 o. L
array = [{picture1}, {picture2} ,{picture3}];                              
3 H2 X3 r* I6 Z7 X%方便循环  
7 G/ v4 p* E  N  S2 Y; s+ F4 C4 n4 a4 j1 p
%保留帧数据
' T* T( M+ M% M9 tfor idx = 1:3
3 _; K/ \# p' l2 o* G2 m$ {1 H    figure(idx)# I% \# i6 k' \- R
    imshow(array{idx});                                                    3 k3 G+ f0 k3 ?0 P1 u9 E8 ^
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     
9 k" L8 v1 f: g0 y" t2 U  |; C    Picture_save{idx} = frame2im(getframe(idx));                           
3 _' h" G$ ~7 P" Y    %获取figure(idx)展示的效果,将其以图片数据保存: r) a- @; w# E3 t/ @+ ~* x
    close all
6 a2 e" p: `# d6 F0 j8 U, dend: Q8 z5 F5 h4 Y6 ]( H3 I

5 C6 ?- l$ Y" r  {%制作GIF
# S. [9 j& M& m; S* _+ Z%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了
; ~+ W4 u# j' E/ J" J# k) efor idx = 1:3
6 u7 m5 o5 ^% F3 m% o8 o    [A,map] = rgb2ind(Picture_save{idx},256);                              
6 h3 T/ N' n! a/ L    %imwrite不能显示三维图像,所以要进行转换
2 k, {! K( s* f    if idx == 1
/ l) Y7 D) j+ ^) A# W+ Q7 w        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);   
& M$ F7 m" F* V7 P         %Inf 无限循环
4 N7 H1 t( w3 n2 B# R3 p    else
, R' [- ?* D$ C6 ]: }        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);6 I, x1 \/ j" ~% G
    end
# [8 G9 s9 D6 O( B' F" Yend4 b- x- c4 R- A1 S
6 h: M; V6 J* k0 Q1 g
close all`) j6 I; x" J+ P- @$ p$ _' A
# c% n. r* b$ }2 f8 m  E2 B( f
. z) w) w- r1 [
以下是代码的截图
5 i/ \% n  ?3 f9 U' r" h( d9 X( ]7 A, S

; w' i$ }. C& m) ^2 a; j9 e. t+ W, M* Q, L
当然了,还有更简单的办法:4 _* R+ s/ g- ~6 @$ `- T

' K- X1 u  y5 v  \( h" }, vfor idx = 1:3
3 s5 ~7 `; U2 d: H! C" n/ e- j    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换& \3 _! @' l  S  W1 d
    if idx == 1! `8 m2 ]. \4 P; \- u( f( n+ t
        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环. }/ t9 {& `' T+ f  i* s+ v; b8 t
    else
$ _( L* f9 Q. R+ t2 D4 I7 b/ W        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);8 T& d( X8 F9 u6 K  k6 g0 p
    end
- b; l# k/ l: a  _end
2 V( q' u/ F1 N6 ?% J; A% R3 E8 Q" Z
3 b" ~+ l; A+ F" m! {  K
# h0 h" V/ R: G' ]& V* S* W2 d关于代码有遇到别的问题,或者有改进意见,欢迎评论。
! q% u# P6 |; ]; l
. T, ~; _! p* L3 I. `; A在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
" O! _4 K+ |- \( ~- X3 m
9 K+ \# m/ S- h
5 x# g/ Q. A$ ~' Q
0 G' N1 W) _6 q: }1 r# ^6 s0 g9 O& M- F# G3 u) n! {
2 |' r3 C  e1 m6 s4 }) n
  • 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-8-24 08:36 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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