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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
目标:将三幅图(png格式)制作成GIF
0 e1 E$ D2 l! k8 q  @* y
% Q2 y$ m- c  f! w" H% S准备材料:三幅png格式的图
% p" C8 q8 H0 {; q! o
6 G+ Y' r8 l- f& Q! { ( Z7 @: V1 F0 c5 W7 |

5 j. T: V- Q+ f% I% E) `  ngif展现一个动态由悲到喜的过程
" i! Z# B/ `, T% W( b& T/ O( ]& }: [! I7 b4 Z  `2 c
实现代码:
( `2 R8 S$ I) Z0 R7 ]+ Q% J( M/ ?; D2 f8 m
`%预定义变量3 p5 K4 p# `& j7 I0 P$ c8 J
Picture_save = {0};                                                        . i; h) r2 ^7 q8 H! p
%初始化提高效率, y( E3 U& j( h+ w0 y0 p& \
filename = 'myGIF.gif';
% @' Q: W* b+ V" H
( L+ X' }: ~. }, N3 g$ ?& T" ]8 ^$ u* e
%图像获取,图像类型转换5 |! K0 A) K* x4 `+ v
[P1, map]  = imread('1.png');     8 x& \- v8 {8 ~
picture1 = ind2rgb(P1,map);                                                ( {) b* g8 E$ |  s
%索引图必须转换为真彩图,否则颜色不对
1 l9 w* G  ?% N% f5 s; ]/ N[P2, map]  = imread('2.png');  c4 w3 b. x6 x. R0 n
picture2 = ind2rgb(P2,map);) g- z1 s! r3 ^# W- J
[P3, map]  = imread('3.png');* h" W/ ?- C1 e; A0 R: D9 C
picture3 = ind2rgb(P3,map);
: n* Q2 x& r( c, B- _3 @1 o' u9 W1 y! t$ w+ {' D
array = [{picture1}, {picture2} ,{picture3}];                              ! j  `' }& K4 V, Q9 @! ~
%方便循环  
6 O3 x& V9 {6 [1 ~4 P7 l3 s" f6 c" w  N. S
%保留帧数据3 J9 W9 e5 _/ ~
for idx = 1:35 l( L0 U5 E  M; `. s$ Z
    figure(idx)
4 j: J7 Z# M7 N% e+ d# r    imshow(array{idx});                                                    5 `8 Z5 N5 j; [; i
    %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型     . K- j/ J9 w3 ^( V0 D: y& u% W
    Picture_save{idx} = frame2im(getframe(idx));                           
. O6 q5 {  ]" L, D+ X    %获取figure(idx)展示的效果,将其以图片数据保存) n5 u/ ?0 I' E0 Q- O# r. ]
    close all! x! I9 R, X+ _. M+ @1 h  a
end0 g0 @$ L9 i5 X) q5 M9 F/ N6 J( {
" I& K+ [( ^3 M3 G' \6 w
%制作GIF: |9 f, V* m' ~  w
%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了
1 W1 L' ]. r% G  ~9 kfor idx = 1:3+ i8 f8 ^( m& H) n
    [A,map] = rgb2ind(Picture_save{idx},256);                              
4 `& `& z- U$ H    %imwrite不能显示三维图像,所以要进行转换: I* B$ L* m' i7 [" ~
    if idx == 1
. p# Y$ H/ X2 C; F" t7 z% S        imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);    " a$ l6 G3 \, Y
         %Inf 无限循环+ J  E7 f; Y! Z& A8 @- T
    else
3 @' b: r) c  P9 ]        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);
9 @* R  `0 X# F0 [% T1 k  G) X! P2 e    end
$ H6 Y9 n5 N  D! S& Z. tend
! @: G2 u+ Y: C) h$ W5 U
4 ^3 U2 @* h' G9 Iclose all`7 e7 D! _: K; c1 w
9 x% B! D! q4 z# M) W, T
' D" |& i9 I$ l/ @# M
以下是代码的截图
0 ?  H6 P: i* C) @" R4 _7 B: z7 e; u3 u

; O5 a/ i% t6 O' |; c; g: ~9 U( S" [  J* {( ~- n& Y. B
当然了,还有更简单的办法:% }0 @3 {1 x% y' x; _
  m+ @/ Q. s% m
for idx = 1:3; J6 d: ~9 u- D) B
    [A,map] = imread(strcat(num2str(idx),'.PNG'));                              %imwrite不能显示三维图像,所以要进行转换( P* `7 r. s' I+ {6 B" }
    if idx == 1$ Z7 y6 `% p7 h! y9 t$ ?* C
        imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5);               %Inf 无限循环
7 u( Y. ~% y, Y% R1 D    else
* o( V0 N0 u( \' v        imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);
7 V* d! ~( ]8 q& ?    end' B- B+ D8 f$ @$ c0 g
end( O( j( ~8 j/ ~( P0 I0 B3 i/ j
6 c" Q' ]3 ~# o) e, c9 H

. s- o6 A5 ^1 {; m- v关于代码有遇到别的问题,或者有改进意见,欢迎评论。
6 _4 E2 L, U3 _* l5 a# _/ q4 d2 A7 c) n( F: f
在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
# N2 r$ a; b/ ^  U+ [+ \7 J3 j% A3 r* }! x. [  F: S" I
+ P/ z# i/ C1 C( t

0 e9 o; `9 s& z% \% X9 G, X8 F, @* G6 ]# \$ h# P
( U1 q9 g% E$ z5 f6 `9 R
  • 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-23 08:34 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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