|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
目标:将三幅图(png格式)制作成GIF# O# \6 n6 ]1 m' N. w
5 o9 `7 S, ^9 S1 [2 W& P, {准备材料:三幅png格式的图& }; }! |: N3 g% _- Y0 [
& E, Z2 j: V- z( U" L- Z% \2 v
; K% w1 f4 ^( J+ Z4 b4 r7 k
: I$ M" b9 i9 T6 P! x% _, C
gif展现一个动态由悲到喜的过程5 Q0 i5 \, o, y# s, s5 g# }- d. e D5 a
. A& f; b* d) K% H* w实现代码:
$ W* B4 j8 i- F- }" F8 `- c# l. I$ i1 H* l
`%预定义变量
* O, g/ k3 A7 M6 p, O% lPicture_save = {0};
' O- p3 K2 t2 K5 i3 t%初始化提高效率
8 _6 B) M g2 d8 X5 N- {filename = 'myGIF.gif';! k8 I. |( z! j5 G! b
3 ]( }5 }2 A) @/ W2 t+ p B
$ ~' d ?1 O. I. t! S, X$ ^; _+ V%图像获取,图像类型转换
! T6 Y' T- x! w9 h[P1, map] = imread('1.png'); 8 h K8 M6 [$ _& x4 \% O0 v7 ]0 {; [
picture1 = ind2rgb(P1,map);
# F$ V( m* s7 o% _+ K/ N%索引图必须转换为真彩图,否则颜色不对; G. E! p- |7 u
[P2, map] = imread('2.png');0 N! w4 d4 C! M$ d
picture2 = ind2rgb(P2,map);: e5 h2 n# _0 S" i0 L) b. S4 t
[P3, map] = imread('3.png');
# e5 t1 S) d8 c7 A5 |picture3 = ind2rgb(P3,map);
3 @# u; Q7 x. E5 Q' U& l8 W4 X
$ U3 J* j8 M( n& R4 }array = [{picture1}, {picture2} ,{picture3}];
& R/ O! V' f( M, G3 k, L%方便循环
/ v& u. ]* H# d
I$ A% P$ r* k; S) m%保留帧数据9 @1 F) m- ^( U; `
for idx = 1:31 T/ G$ N: u7 @% O& ~1 }: B. m
figure(idx)
% G: G8 `$ T# u+ B% B imshow(array{idx});
, Z9 O" M" V& [3 o %索引图转换为真彩图 ,{}访问数组里面的类型 ()访问元胞类型
$ i7 x! \( ]! r# B Picture_save{idx} = frame2im(getframe(idx)); / Q3 S E' Q: Q. V3 ~: R( S0 V
%获取figure(idx)展示的效果,将其以图片数据保存! ~0 m9 J" c$ N5 I3 E2 A3 s
close all
2 ~5 r$ S- y4 g# F) s4 W% _3 [end
4 ~: p) l8 M' C! f4 \/ u- h9 |2 V% v- a! Z) H, z* ` F/ ^
%制作GIF& V* p$ V' }3 [2 \6 `7 Z
%有个bug 在第一次播放的时候没有中间的那一帧,之后又有了- A/ Q+ O( I7 X* Z$ _3 G8 p
for idx = 1:3
1 R3 r0 t" H* X; l/ B5 ~ [A,map] = rgb2ind(Picture_save{idx},256);
2 e3 B9 h9 C2 A# c0 Q7 K %imwrite不能显示三维图像,所以要进行转换% Q/ G2 z7 n+ ~7 I
if idx == 1
' P1 f& `# g% B+ G& g3 a2 h; J imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',0.5);
! @) U8 {' j5 Z3 i %Inf 无限循环# r" M7 r4 ]0 E$ ?& p- J* n
else z1 n. Z: A+ X) z% A: V
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.5);# b9 `' e$ @6 N: ^
end# A* G9 z; g3 z0 H1 E. |, J
end
* a6 j _7 {' k: _+ Z$ Y7 S6 {
' t4 t, l# A/ ?5 w7 Y" v4 R. I+ aclose all`/ F5 M) ^8 I: n, i, s
' L( b8 T$ i" {3 q" b, M
1 [7 f' m6 G9 `8 v以下是代码的截图2 H3 F5 L& b/ ^5 ]4 C- c
`5 K# s! k" W4 l; F: }8 B
W& G, I n5 s5 V! x( A
- U* K- J; T4 _" j2 c5 l8 ]3 A: n$ h+ ~8 q
当然了,还有更简单的办法:
2 `( n: N5 c+ J" J
+ f: D; a8 V0 ~! B# E& mfor idx = 1:3
0 B( t- t8 V, o; M8 m l [A,map] = imread(strcat(num2str(idx),'.PNG')); %imwrite不能显示三维图像,所以要进行转换/ y- n) C6 l, D0 U* b: ~
if idx == 1' q8 j' a8 w$ U( O
imwrite(A,map,'new.gif','LoopCount',Inf,'DelayTime',0.5); %Inf 无限循环& Q* c2 C% S0 J- ? W
else2 t: A5 l b4 A) ~
imwrite(A,map,'new.gif','WriteMode','append','DelayTime',0.8);
. ^) k; C4 G$ |1 V end2 [, B: c$ o8 o3 X* v# R
end8 I0 g7 O- @4 ], _& o
( s& r( v+ I* I q$ _! V- m4 a
- X' X2 y7 s) _: k% P e3 @. C6 \关于代码有遇到别的问题,或者有改进意见,欢迎评论。
, P4 y. Q; d" Z# C, Q4 [
# i* q$ g2 T$ Z% m7 \! r6 T在实现过程中我也遇到了很多问题,有些注释在代码中,有些遗漏了,希望可以在讨论中得到补充。
" c& W8 S6 O" T9 b+ s8 h
) G7 |" x: D- \# C3 @" I/ f% }+ Q$ g; w3 e3 J
$ O8 O. D6 O5 S2 S* X
" \; d8 G2 Z" k) S' H1 n& T
3 k p: B8 C# ]2 ?, g |
|