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