13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MATLAB/SimulinkAdvent Calendar 2023

Day 4

MATLABでGIFアニメーションを作成するベストプラクティス

Last updated at Posted at 2023-12-03

この記事では,MATLABでGIFアニメーションを作成するベストプラクティスを紹介します.
MATLAB Flipbook Mini Hackの情報を参考に,記事を執筆しています.

はじめに

MATLABコミュニティでは,定期的にコンテストを開催しています.
2023年11月6日~12月3日の期間,MATLAB Flipbook Mini Hackが開催されました.
これは,2000文字以内のMATLABコードで,どのような素晴らしいアニメーションを作成できるか競うコンテストです.
GIFアニメーションを作成するMATLABコードを投稿し,生成されたGIFを人気投票します.

去年と一昨年に開催された画像コンテスト(1)(2)は,コンテスト終了後もコードと画像が公開されているので,今回のコンテスト参加者のデータも公開状態のままだと思います.

コンテスト主催者が用意した素晴らしいコードを
MATLABでGIFアニメーションを作成するベストプラクティスとして紹介します.

アニメーション生成関数

MATLABコードは,コンテスト参加者が共通して利用するcontestAnimator関数と各自で記述するdrawframe関数に分かれます.
contestAnimator関数は,以下の通りです.

contestAnimator.m
function contestAnimator()
    animFilename = 'animation.gif'; % Output file name
    firstFrame = true;
    framesPerSecond = 24;
    delayTime = 1/framesPerSecond;
    % Create the gif
    for frame = 1:48
        drawframe(frame)
        fig = gcf(); 
        fig.Units = 'pixels';
        fig.Position(3:4) = [300,300];
        im = getframe(fig);
        [A,map] = rgb2ind(im.cdata,256);
        if firstFrame
            firstFrame = false;
            imwrite(A,map,animFilename, LoopCount=Inf, DelayTime=delayTime);
        else
            imwrite(A,map,animFilename, WriteMode="append", DelayTime=delayTime);
        end
    end
end

最初の4行には,設定が書かれています.
まず,出力するファイル名を指定します.
次に,firstFrame変数をtrueで宣言します.GIFアニメーション作成の1フレーム目とそれ以降のフレームでは処理が違うため,その分岐に使用します.
そして,1秒間の動画を何枚の画像で構成するか,1枚の画像を何秒表示するか指定します.

for文で画像を1枚づつファイルに追加することで,GIFアニメーションを作成します.
今回は,48枚の画像を用いて2秒のGIFアニメーションを作成します.
drawframe(frame)は,各自で記述する画像作成関数です.
作成した画像について,幾つかの整形をした後,imwrite関数でGIFアニメーションを作成,更新します.

im.cdataは,300x300x3 uint8型のデータです.ピクセル毎のRGB値が格納されています.
mapは,Nx3 doubleN色カラーマップです.画像に使われている色が格納されています.
Aは,300x300 uint8型のデータです.ピクセル毎に対応するmapのインデックスが格納されています.

アニメーション作成例

どのようなGIFアニメーションが作成できるのか,試してみます.
こちらのコードを参考に,以下のコードでGIFアニメーションを作成します.

drawframe.m
function drawframe(f)
    cla
    text(0.2,0.5,sprintf('%2d',f),fontsize=100);
end

animation.gif

contestAnimator.mを実行するだけで.GIFアニメーションを簡単に作成できました.
1秒間に24秒の画像が表示されると,目に優しくなさそうです.
ギャラリーからお気に入りのGIFを見つけて,皆さんも遊んでみてはいかがでしょうか?

自分も3つほどコードを投稿してみました.
frame数やdelayTimeの変更で,緩やかに変化する長いGIFアニメーションを作成できます.

Simplex-lattice design Incremental Lattice Design Bayesian optimization

終わりに

GIFアニメーションは,QiitaやGitHubを含む色々なサイトで利用できます.
GIFアニメーションを積極的に活用していきましょう.

13
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?