トップへ(mam-mam.net/)

ローディング アニメーションGIFファイルを作成するアプリを作る ~Delphiソースコード集

検索:

ローディング アニメーションGIFファイルを作成するアプリを作る ~Delphiソースコード集

IDE上でフォームにコンポーネントをドラッグ&ドロップし、プロパティを設定し、ソースコードを入力して、ローディングGIFアニメーションファイルを作成する本格的なアプリケーションを作成します。

画面設計

Delphi IDEを起動し、「ファイル」⇒「Windows VCLアプリケーション -Delphi」をクリックしてプロジェクトと初期フォームを作成します。
右下ペインにある「パレット」から以下コンポーネントをドラッグ&ドロップします。

フォームにドラッグ&ドロップした「ComboBox1」をクリックして選択します。
左下ペインの「オブジェクトインスペクタ」の「プロパティ」タブをクリックして選択します。
ComboBox1の「Items」プロパティの右にある「...」ボタンをクリックします。

「文字列リストの設定」ウィンドウが表示されますので、以下のように
16と改行、24と改行、32と改行、40と改行、48と改行、56と改行、64と改行
を入力し、「OK」ボタンをクリックしてウィンドウを閉じます。

ComboBox1の「Style」プロパティの右にある「v」ボタンをクリックし、「csDropDownList」をクリックして選択します。

ComboBox1の「ItemIndex」プロパティの値を「1」に設定します。

フォームにドラッグ&ドロップした「SaveDialog1」をクリックして選択します。
左下ペインの「オブジェクトインスペクタ」の「プロパティ」タブをクリックして選択します。
SaveDialog1の「Filter」プロパティの右にある「...」ボタンをクリックします。

「フィルタの設定」ダイアログが表示されますので、以下のように
フィルタ名に「GIF」、フィルタに「*.gif」を入力し「OK」ボタンをクリックしてダイアログを閉じます。

SaveDialog1のプロパティ「Options⇒efOverwritePrompt」プロパティをクリックして「true」に設定します。

ソースコードの記述

「Button1」をダブルクリッククリックします。
コード入力画面に切り替わります。

以下のソースコードを記述します。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ActnMan,
  Vcl.ActnColorMaps;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ColorBox1: TColorBox;
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses VCL.Imaging.GIFImg;

procedure TForm1.Button1Click(Sender: TObject);
var bmp:TBitmap;
    gif:TGIFImage;
    gifFrame:TGIFFrame;
    gifGCE:TGIFGraphicControlExtension;
    i,j:Integer;
    rad:Integer;
    r,g,b:byte;
    TransparentColor:TColor;
begin
  if SaveDialog1.FileName<>'' then
  begin
    SaveDialog1.InitialDir:=ExtractFileDir(SaveDialog1.FileName);
    SaveDialog1.FileName:=ExtractFileName(SaveDialog1.FileName);
  end
  else
  begin
    SaveDialog1.FileName:='Default,gif';
  end;
  if not SaveDialog1.Execute then exit;

  //透過色(絶対使われないような色を設定)
  TransparentColor:=rgb($F1,$F2,$F3);
  bmp:=TBitmap.Create;
  gif:=TGIFImage.Create;
  try
    bmp.Width:=StrToInt(ComboBox1.Items[ComboBox1.ItemIndex]);
    bmp.Height:=bmp.Width;
    rad:=bmp.Width div 2;

    r:=($FF-GetRValue(ColorBox1.Selected)) div 15;
    g:=($FF-GetGValue(ColorBox1.Selected)) div 15;
    b:=($FF-GetBValue(ColorBox1.Selected)) div 15;

    bmp.Canvas.Pen.Width:=bmp.Width div 16;
    for i := 0 to 15 do
    begin
      bmp.Canvas.Brush.Color:=TransparentColor;
      bmp.Canvas.FillRect(bmp.Canvas.ClipRect);
      for j := 0 to 15 do
      begin
        bmp.Canvas.Pen.Color:=rgb($FF-r*j,$FF-g*j,$FF-b*j);
        bmp.Canvas.MoveTo(
          rad+Round(cos(Pi/8*(j+i))*rad*0.6),
          rad+Round(sin(Pi/8*(j+i))*rad*0.6)
        );
        bmp.Canvas.LineTo(
          rad+Round(cos(Pi/8*(j+i))*rad),
          rad+Round(sin(Pi/8*(j+i))*rad)
        );
      end;
      gifFrame:=gif.Add(bmp);
      gif.OptimizeColorMap;
      gifGCE:=TGIFGraphicControlExtension.Create(gifFrame);
      gifGCE.TransparentColor:=TransparentColor;
      gifGCE.Transparent:=True;
      gifGCE.Disposal:=dmBackground;
      gifGCE.Delay:=5;  // 1/100秒単位なので 0.05秒/フレーム
    end;

    //無限ループ再生に設定する
    TGIFAppExtNSLoop.Create(gif.Images[0]).Loops:=0;
    //最適化
    gif.Optimize(
      [TGIFOptimizeOption.ooCrop,
       TGIFOptimizeOption.ooMerge,
       TGIFOptimizeOption.ooCleanup,
       TGIFOptimizeOption.ooColorMap],
      TColorReduction.rmQuantize,
      TDitherMode.dmNearest, 8
    );
    image1.Picture.Assign(gif);
    TGIFImage(Image1.Picture.Graphic).Animate := True;

    gif.SaveToFile(SaveDialog1.FileName);
  finally
    bmp.Free;
    gif.Free;
  end;
end;

end.

実行する

IDEの実行ボタンをクリックして実行します。
ご参考:右下の「コード」「デザイン」タブをクリックして切り替えできます。

作成したアプリケーションがコンパイルされ、実行します。
コンボボックスでGIFファイルのサイズを設定できます。
カラーボックスでGIF画像の色を設定できます。
「Button1」をクリックするとGIFファイルの保存先ダイアログが開きますので、保存先フォルダを選択して、ファイル名を設定して「保存(S)」ボタンを押します。

生成されたアニメーションGIFファイルが保存され、プレビューが表示されます。