Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2023年01月03日] [更新 2023年01月03日] Delphi サンプルプログラム集
088_TBitmap の画像を TImage に描画
動作確認等 Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32
088_Bitmap_DrawToTImage.zip [3,6 MB] 2023年01月03日版 (EXE 同梱)







TBitmap の画像を TImage に描画


主に TBitmap の画像を TImage に描画するサンプルです。
サンプルプログラム集には、処理の結果として TBitmap の画像を TImage に描画するサンプルはありますが、本ページは、単純にファイルから読み出した TBitmap の画像を表示するたけのサンプルとしています。



[備考]
TBitmap の TransparentColor も Transparent プロパティも public なプロパティです。実行時にこれらの値を設定して TBitmap の画像を保存しても、これらの値は保存されません。
TransparentColor のデフォルト値は TBitmap.Canvas の左下のピクセルの色となります。Transparent プロパティのデフォルト値は False です。
TBitmap の AlphaFormat も public なプロパティです。デフォルトは afIgnored です。





01_アルファ値を使用する 32 ビットの TBitmap を TImage に描画


Delphi の TBitmap 画像の色深度はデフォルトで 32 ビットです。32 ビットの TBitmap は、各ピクセルの不透明度を指定する 1 バイトのアルファ値を格納するデータ領域を持っていますが、デフォルトではこのデータを使用しません。アルファ値を使用した描画を行うには、AlphaFormat プロパティの値を afDefined にします。AlphaFormat プロパティは public なプロパティです。

本サンプルでは、アルファ値のデータが 0 でないビットマップを読み込んで、TImage に描画します。これは、アルファ値を使用するビットマップということになります。

下図は AlphaFormat プロパティの値を afDefined の場合です。背景の市松模様が見えているピクセルは、A, R, G, B の値が全て 0 のピクセルです。ここれは透明色です。透明色のピクセルが透過状態になります。半透明の色を透過職にすることはできません。
A はアルファ値を意味します。




図1
AlphaFormat が afDefined の場合

AlphaFormat プロパティの値を指定しない場合です。
AlphaFormat プロパティの値を指定しない場合は、AlphaFormat プロパティの値を afIgnored にした場合と同じになり、アルファ値を使用しないで描画します。透明色のピクセルの R, G, B の値は 0 です。アルファ値を使用しないので「黒」になります。

これは、24 ビット以下のビットマップ画像ファイルを TBitmap に読み込んだ時と同じです。24 ビット以下のビットマップを読み込んだ時は、TBitmap のビット深さは、そのビットマップのビット深さと同じになります。24 ビット以下のビットマップにはアルファチャンネルはありません。




図2
AlphaFormat を指定しない場合
  • AlphaFormat が afIgnored の時と同じになる
  • afIgnored はデフォルトの値

同じく、AlphaFormat プロパティの値を指定しない場合ですが、Transparent プロパティの値を True にした場合です。
Transparent が True の時、デフォルトでは画像の左下のピクセルの色が透過色になります。AlphaFormat を指定していないのでアルファ値は無効ですから、左下のピクセルの色は「黒」です。したがって、画像の黒のピクセルが透過状態になります。下図で黒く見えるピクセルは、元は半透明のピクセルです。実際には黒ではなく、黒に近い色です。R, G, B の値が 0 に近い色です。




図3
AlphaFormat を指定しないで、Transparent を True にした場合

リスト1
アルファ値を使用する 32 ビットの TBitmap を TImage に描画
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;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  FImgFilePath : string = '..\Images\images_32bit.bmp';

//=============================================================================
//  アルファチャンネル付きの 32 ビットのビットマップを TImage に描画
//  TBitmap.AlphaFormat := afDefined にすればよい
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.AlphaFormat := afDefined;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  アルファチャンネル付きの 32 ビットのビットマップを TImage に描画
//  TBitmap.AlphaFormat の値を指定しない場合
//  TBitmap.AlphaFormat := afIgnored ( デフォルト ) と同じ
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  アルファチャンネル付きの 32 ビットのビットマップを TImage に描画
//  TBitmap.Transparent := True にした場合
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.Transparent := True;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//-----------------------------------------------------------------------------
//  引数のビットマップを TImage に描画
//  透過状態確認用に、背景を市松模様のビットマップにする
//-----------------------------------------------------------------------------
procedure TForm1.BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
var
  LBitmap : TBitmap;
begin
  AImage.Picture.Assign(nil);

  // TImage32 の背景を市松模様のタイルにする
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile('..\Images\backTexture_02.bmp');

    AImage.Canvas.Brush.Style  := bsSolid;
    AImage.Canvas.Brush.Bitmap := LBitmap;
    AImage.Canvas.FillRect(AImage.Canvas.ClipRect);
  finally
    FreeAndNil(LBitmap);
  end;

  // ビットマップ画像を描画
  AImage.Canvas.Draw(0, 0, ABitmap);
end;
end.


[備考]
32 ビットの、アルファ値が 0 でないビットマップの PixelFormat プロパティの値を pf24bit にした場合、減色処理が行われます。その結果、半透明のピクセルは異なる色になります。
例えば、本項で使用したビットマップ画像の場合、半透明のピクセルは黒に近い色になります。





02_アルファ値を使用しない 32 ビットの TBitmap を TImage に描画


前項と同じで、32 ビットのビットマップを読み込み、TImage に描画しますが、このビットマップは、アルファ値が全て 0 のビットマップです。
24 ビット以下のビットマップの  PixelFormat プロパティの値を pf32bit にすると、アルファ値を使用しないビットマップとなります。

下図は、32 ビットのビットマップ画像ファイルを読み込んで、そのまま IImage に描画した結果です。サンプルコードでは 、AlphaFormat プロパティの値を afIgnored にしていますが、これはデフォルト値なので設定しなくても結果は同じです。




図4
TBitmap に、ビットマップ画像ファイルを読み込んで描画

Transparent プロパティの値を True にした場合です。
Transparent を True にすると、デフォルトでは画像の左下のピクセルの色が透過色になります。本サンプルで使用した画像では枠線の色です。




図5
Transparent を True にした場合

同じく、Transparent プロパティの値を True にする例ですが、透過色を TransparentColor プロパティで指定した結果です。透過色は、枠線内の色にしています。




図6
Transparent を True にした場合
  • 透過色は枠線内部の色
  • 透過色は TransparentColor で設定

下図は AlphaFormat プロパティの値を afDefined にした場合です。透明な画像になります。
本サンプルで使用している TBitmap の画像は、アルファ値が全て 0 です。全てのピクセルで R, G, B の値は 0 ではありません。しかし、AlphaFormat を afDefined にすると、アルファ値を使用して描画します。アルファ値が 0 ということは、不透明度が 0 ということです。つまり、透明ということです。




図7
AlphaFormat を afDefined にした場合
  • 全てのピクセルが透明な画像になる

リスト2
アルファ値を使用しない 32 ビットの TBitmap を TImage に描画
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;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  FImgFilePath : string = '..\Images\Frame_32bit.bmp';

//=============================================================================
//  アルファチャンネルを使用しない 32 ビットのビットマップを TImage に描画
//  TBitmap.AlphaFormat := afIgnored ( デフォルト ) にすればよい
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.AlphaFormat := afIgnored;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  アルファチャンネルを使用しない 32 ビットのビットマップを TImage に描画
//  TBitmap.Transparent := True にした場合
//  透過色は左下のピクセルの色になる
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.Transparent := True;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  アルファチャンネルを使用しない 32 ビットのビットマップを TImage に描画
//  透過色を指定して、TBitmap.Transparent := True にした場合
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.TransparentColor := LBitmap.Canvas.Pixels[5, 5];
    LBitmap.Transparent := True;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  アルファチャンネルを使用しない 32 ビットのビットマップを TImage に描画
//  TBitmap.AlphaFormat := afDefined ( アルファ値を使用) にした場合
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.AlphaFormat := afDefined;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//-----------------------------------------------------------------------------
//  引数のビットマップを TImage に描画
//  透過状態確認用に、背景を市松模様のビットマップにする
//-----------------------------------------------------------------------------
procedure TForm1.BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
var
  LBitmap : TBitmap;
begin
  AImage.Picture.Assign(nil);

  // TImage の背景を市松模様のタイルにする
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile('..\Images\backTexture_02.bmp');

    AImage.Canvas.Brush.Style  := bsSolid;
    AImage.Canvas.Brush.Bitmap := LBitmap;
    AImage.Canvas.FillRect(AImage.Canvas.ClipRect);
  finally
    FreeAndNil(LBitmap);
  end;

  // ビットマップ画像を描画
  AImage.Canvas.Draw(0, 0, ABitmap);
end;
end.




03_24 ビット以下の TBitmap 画像を TImage に描画


24 ビット以下のビットマップ画像のファイルを読み込んで TImage に描画する場合です。
24 ビット以下の TBitmap にはアルファチャンネルはありません。ピクセルの色は R, G, B の 3 バイトの値で決まります。

下図は、TBitmap に、24 ビットのビットマップ画像を読み込んで TImage に描画した結果です。




図8
24 ビットのビットマップ画像

Transparent プロパティの値を True にした場合です。
Transparent を True にすると、デフォルトでは画像の左下のピクセルの色が透過色になり、透過状態になります。




図9
24 ビットのビットマップ画像
  • Transparent を True にした場合

同じく、Transparent プロパティの値を True にする例ですが、透過色を TransparentColor プロパティで指定した結果です。透過色は、画像左上の四角形のピクセルの色にしています。この色は黒です。




図10
24 ビットのビットマップ画像
  • TransparentColor の値を黒にして
  • Transparent を True にした場合

AlphaFormat プロパティの値を afDefined にした場合です。24 ビット以下の TBitmap では、AlphaFormat を設定しても無効です。AlphaFormat プロパティは、32 ビットの TBitmap 用のプロパティです。




図11
24 ビットのビットマップ画像
  • AlphaFormat の設定は無効

リスト3
24 ビット以下の TBitmap 画像を TImage に描画
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;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  FImgFilePath : string = '..\Images\simple_24bit.bmp';

//=============================================================================
//  24 ビット以下のビットマップを TImage に描画
//  24 ビット以のビットマップにはアルファチャンネルがない
//  TBitmap.AlphaFormat := afIgnored ( デフォルト ) にすればよい
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.AlphaFormat := afIgnored;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  24 ビット以下のビットマップを TImage に描画
//  24 ビット以のビットマップにはアルファチャンネルがない
//  TBitmap.Transparent := True にした場合
//  透過色は左下のピクセルの色になる
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.Transparent := True;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  24 ビット以下のビットマップを TImage に描画
//  24 ビット以のビットマップにはアルファチャンネルがない
//  透過色を指定して、TBitmap.Transparent := True にした場合
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.TransparentColor := LBitmap.Canvas.Pixels[5, 5];
    LBitmap.Transparent := True;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//=============================================================================
//  24 ビット以下のビットマップを TImage に描画
//  24 ビット以のビットマップにはアルファチャンネルがないので
//  TBitmap.AlphaFormat の値は描画に関係ない
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FImgFilePath);

    LBitmap.AlphaFormat := afDefined;
    BmpDrawTo(LBitmap, Image1);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//-----------------------------------------------------------------------------
//  引数のビットマップを TImage に描画
//  透過状態確認用に、背景を市松模様のビットマップにする
//-----------------------------------------------------------------------------
procedure TForm1.BmpDrawTo(ABitmap: TBitmap; AImage: TImage);
var
  LBitmap : TBitmap;
begin
  AImage.Picture.Assign(nil);

  // TImage の背景を市松模様のタイルにする
  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile('..\Images\backTexture_02.bmp');

    AImage.Canvas.Brush.Style  := bsSolid;
    AImage.Canvas.Brush.Bitmap := LBitmap;
    AImage.Canvas.FillRect(AImage.Canvas.ClipRect);
  finally
    FreeAndNil(LBitmap);
  end;

  // ビットマップ画像を描画
  AImage.Canvas.Draw(0, 0, ABitmap);
end;

end.




04_フォルダ内の BMP / PNG / GIF / ICO 画像を TImage に連続描画


添付の [Images] フォルダ内には、テスト用の画像があります。その [Imagaes] フォルタ内の画像ファイルを、順番に読み出して表示するサンプルです。
画像は、TImage の左右上下の中央に描画するようにしています。




図12
フォルダ内の画像を順番に表示

リスト4
フォルダ内の BMP / PNG / GIF / ICO 画像を順番に、TImage に描画
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.Buttons,
  Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    SpeedButton2: TSpeedButton;
    SpeedButton1: TSpeedButton;
    Image1: TImage;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private 宣言 }
    FFileDir  : string;
    FFileList : TStringList;
    procedure DrawBackGouundBmp(AImage: TImage; AWidth, AHeight: Integer);
  public
    { Public 宣言 }
  end;

  function BmpIsUsedAlphaValue(ABitmap: TBitmap): Boolean;

var
  Form1: TForm1;

implementation

uses
  System.Types,
  System.IOUtils,
  System.StrUtils,
  Vcl.Imaging.pngimage,
  Vcl.Imaging.GIFImg;

{$R *.dfm}

const
 FExtArray : array [0..3] of string = ('.bmp', '.png', '.gif', '.ico');

//=============================================================================
//  フォーム生成時の処理
//  指定ディレクトリ内の指定拡張子のファイルのリストを作成
//
//  uses に System.Types,System.IOUtils が必要
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  LFileArray : TStringDynArray;
  LFileExe   : string;
  LIndex     : Integer;
begin
  CheckBox1.Caption := 'ビットマップの透過色を使用する透過処理';

  FFileDir := '..\Images\';
  LFileArray := TDirectory.GetFiles(FFileDir, '*.*');

  FFileList := TStringList.Create;
  for LIndex := 0 to Length(LFileArray) - 1 do begin
    LFileExe := ExtractFileExt(LFileArray[LIndex]);
    if MatchText(LFileExe, FExtArray) then begin
      FFileList.Add(LFileArray[LIndex]);
    end;
  end;

  SpeedButton2Click(SpeedButton2);
end;

//=============================================================================
//  フォーム破棄時の処理
//=============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FFileList);
end;

//=============================================================================
//  前の画像ファイルを読み込んで表示
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  SpeedButton2Click(SpeedButton1);
end;

//=============================================================================
//  次の画像ファイルを読み込んで表示
//  uses に System.IOUtils, Vcl.Imaging.pngimage, Vcl.Imaging.GIFImg が必要
//=============================================================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
{$WRITEABLECONST ON}
const
  LIndex : Integer = -1;
{$WRITEABLECONST OFF}
var
  LImgPath : string;
  LFileExt : string;
  LBitmap  : TBitmap;
  LPngImg  : TPngImage;
  LGifImg  : TGIFImage;
  LIcon    : TIcon;
begin
  if Sender = SpeedButton2 then begin
    Inc(LIndex);
  end else
  if Sender = SpeedButton1 then begin
    Dec(LIndex);
  end;

  if (LIndex + 1) > FFileList.Count then begin
    LIndex := FFileList.Count - 1;
    Exit;
  end;
  if LIndex < 0 then begin
    LIndex := 0;
    Exit;
  end;


  while True do begin
    LImgPath := FFileList[LIndex];
    if FileExists(LImgPath) then Break;
    FFileList.Delete(LIndex);
    if (LIndex + 1) > FFileList.Count then Exit;
  end;

  SpeedButton1.Enabled := (LIndex > 0) and (FFileList.Count >= 2);
  SpeedButton2.Enabled := ((LIndex + 1) < FFileList.Count) and (FFileList.Count >= 2);


  LFileExt := LowerCase(ExtractFileExt(LImgPath));
  Edit1.Text := ExtractFileName(LImgPath);


  // [前] [次] の機能を正常に動作させるには、
  // FExtArray ( 拡張子名の配列) にある拡張子のファイルは全て処理する

  // ビットマップ画像ファイルの場合
  if LFileExt = '.bmp' then begin
    LBitmap := TBitmap.Create;
    try
      LBitmap.LoadFromFile(LImgPath);
      if not BmpIsUsedAlphaValue(LBitmap) then begin
        if CheckBox1.Checked then begin
          LBitmap.TransparentColor := LBitmap.Canvas.Pixels[0, LBitmap.Height - 1];
          LBitmap.Transparent := True;
        end;
      end;
      DrawBackGouundBmp(Image1, LBitmap.Width, LBitmap.Height);
      Image1.Canvas.Draw(0, 0, LBitmap);
    finally
      FreeAndNil(LBitmap);
    end;
  end else

  // PNG 画像ファイルの場合
  if LFileExt = '.png' then begin
    LPngImg := TPngImage.Create;
    try
      LPngImg.LoadFromFile(LImgPath);
      DrawBackGouundBmp(Image1, LPngImg.Width, LPngImg.Height);
      Image1.Canvas.Draw(0, 0, LPngImg);
    finally
      FreeAndNil(LPngImg);
    end;
  end else

// GIF 画像ファイルの場合
  if LFileExt = '.gif' then begin
    LGifImg := TGIFImage.Create;
    try
      LGifImg.LoadFromFile(LImgPath);
      DrawBackGouundBmp(Image1, LGifImg.Width, LGifImg.Height);
      Image1.Canvas.Draw(0, 0, LGifImg);
    finally
      FreeAndNil(LGifImg);
    end;
  end else

  // ICO 画像ファイルの場合
  // TIcon 画像は TBitmap に変換
  // 32 ビットの TIcon であればそのまま TImage に描画可能
  if LFileExt = '.ico' then begin
    LBitmap := TBitmap.Create;
    LIcon   := TIcon.Create;
    try
      LIcon.LoadFromFile(LImgPath);
      LBitmap.Assign(LIcon);
      DrawBackGouundBmp(Image1, LBitmap.Width, LBitmap.Height);
      Image1.Canvas.Draw(0, 0, LBitmap);
    finally
      FreeAndNil(LBitmap);
      FreeAndNil(LIcon);
    end;
  end;
end;

//=============================================================================
//  CheckBox1 をクリックしたら再描画
//=============================================================================
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  SpeedButton2Click(nil);
end;

//-----------------------------------------------------------------------------
//  画像の描画領域の背景を市松模様のビットマップ画像にする
//  透過状態の確認用
//  描画位置は TImage の中央
//-----------------------------------------------------------------------------
procedure TForm1.DrawBackGouundBmp(AImage: TImage; AWidth, AHeight: Integer);
var
  LBitmap : TBitmap;
begin
  AImage.Picture.Assign(nil);
  AImage.Picture.Bitmap.SetSize(AWidth, AHeight);
  AImage.Center := True;

  LBitmap := TBitmap.Create;
  try
    LBitmap.LoadFromFile(FFileDir + 'backTexture_02.bmp');

    AImage.Canvas.Brush.Style  := bsSolid;
    AImage.Canvas.Brush.Bitmap := LBitmap;
    AImage.Canvas.FillRect(AImage.Canvas.ClipRect);
  finally
    FreeAndNil(LBitmap);
  end;
end;

//-----------------------------------------------------------------------------
//  アルファチャンネル付きのビットマップかを判定
//  アルファチャンネル付きは、描画にアルファを使用していること
//
//  戻り値
//
//  True :  アルファチャンネルを使用する 32 ビットのビットマップ
//          引数の TBitmap.AlphaFormat の値を afDefined にして返す
//
//  False : アルファチャンネルを使用しない 32 ビットのビットマップ
//          引数の TBitmap.AlphaFormat の値を afIgnored にして返す
//          24 ビット以下の時も戻り値も False
//
//  透過ピクセルが透明色の場合、
//  TBitmap.TransparentColor の値が $02000000 であるかで判定できるが、
//  判定する前に TransParentColor の値を設定してしまうと区別できない
//-----------------------------------------------------------------------------
function BmpIsUsedAlphaValue(ABitmap: TBitmap): Boolean;
type
  TRGBQArray = array [0..4095] of RGBQUAD;
  PRGBQArray = ^TRGBQArray;
var
  LXPos      : integer;
  LYPos      : Integer;
  LBmpScan  : PRGBQArray;
  LPixelCnt : Integer;
begin
  Result := False;
  if ABitmap.PixelFormat <> pf32bit then Exit;


  ABitmap.Canvas.Lock;
  try
    ABitmap.AlphaFormat := afIgnored;

    LPixelCnt := 0;
    for LYPos := 0 to ABitmap.Height - 1 do begin
      LBmpScan := ABitmap.ScanLine[LYPos];
      for LXPos := 0 to ABitmap.Width - 1 do begin
        if (LBmpScan[LXPos].rgbReserved = 0) then Inc(LPixelCnt);
      end;
    end;
    Result := LPixelCnt <> (ABitmap.Width * ABitmap.Height);

    if Result then begin
      ABitmap.AlphaFormat := afDefined;
    end else begin
      ABitmap.AlphaFormat := afIgnored;
    end;
  finally
    ABitmap.Canvas.Unlock;
  end;
end;

end.


アルファチャンネル付きの TBitmap 画像を TPngImage 画像に変換するのは少し面倒ですが、TPngImage 画像から TBitmap 画像への変換は、以下のように Asssign メソッドで可能です。


  LPngImg := TPngImage.Create;
  LBitmap := TBitmap.Create;
  try
    LPngImg.LoadFromFile(LImgPath);
    LBitmap.Assign(LPngImg);
    DrawBackGouundBmp(Image1, LPngImg.Width, LPngImg.Height);
    Image1.Canvas.Draw(0, 0, LBitmap);
  finally
    FreeAndNil(LPngImg);
    FreeAndNil(LBitmap);
  end;
end;


TGIFImage 画像の透過色は、次のように、TGIFImage.Bitmap.TransparentColor;で取得できます。
このサンプルは、TBitmap 画像の透過色を、TGIFImage 画像の透過色と同じにします。


  LGifImg := TGIFImage.Create;
  LBitmap := TBitmap.Create;
  try
    LGifImg.LoadFromFile(LImgPath);
    LBitmap.Assign(LGifImg);
    LBitmap.TransparentColor := LGifImg.Bitmap.TransparentColor;
    LBitmap.Transparent := True;

    DrawBackGouundBmp(Image1, LGifImg.Width, LGifImg.Height);
    Image1.Canvas.Draw(0, 0, LBitmap);
  finally
    FreeAndNil(LGifImg);
    FreeAndNil(LBitmap);
  end;