|
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
|
|