Delphi2007以降、Finn TolderlundさんのTGIFImageがDelphiのソースに統合され、DelphiでGIFファイルを扱えるようになっています。ヘルプファイルにも書かれている通り、透過GIFで保存する簡単な方法は次の通りです。
USES ・・・, Vcl.Graphics, Vcl.Imaging.GIFImg;
・
・
・
procedure TForm1.ReadAndSaveTransGif;
var Bitmap: TBitmap;
GIFImage: TGIFImage;
begin
Bitmap := TBitmap.Create;
GIFImage := TGIFImage.Create;
try
Bitmap.LoadFromFile(ビットマップファイルのパス);
Bitmap.Transparent := True;
Bitmap.TransparentColor := Bitmap.Canvas.Pixels[0,Bitmap.Height-1]; // ここでは左下の色を透過色に指定
GIFImage.Assign(Bitmap);
GIFImage.SaveToFile(GIFファイルのパス);
finally
FreeAndNil(GIFImage);
FreeAndNil(Bitmap);
end;
end;
GIFファイルに直接透過色を指定することもできます。とほほさんのGIFフォーマットの詳細やW3CのGIF89a仕様書を見ると、透過GIFは「Graphic Control Extension」のTransparentとTranparentColorで指定されます。この拡張(Extension)はDelphiでもサポートされており、これを利用すると、TImageで読み込めるファイル全てに対してビットマップをCreateすることなく透過GIFで保存できます。
USES ・・・, Vcl.ExtCtrls, Vcl.Imaging.GIFImg;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Image1: TImage;
procedure FormCreate(Sender: TObject);
・
・
・
procedure TForm1.ReadAndSaveTransGif;
var GIFImage : TGIFImage;
GCE : TGIFGraphicControlExtension;
begin
Image1.Picture.LoadFromFile(イメージファイルのパス);
GIFImage := TGIFImage.Create;
try
GIFImage.Assign(Image1.Picture.Graphic);
GCE := TGIFGraphicControlExtension.Create(GIFImage.Images[0]);
GCE.Transparent := True;
GCE.TransparentColor := GIFImage.Bitmap.Canvas.Pixels[0,GIFImage.Bitmap.Height-1];
GIFImage.SaveToFile(GIFファイルのパス);
finally
FreeAndNil(GIFImage);
end;
end;
上述のコードで、TGIFGraphicControlExtensionが前述の「Graphic Control Extension」です。TGIFGraphicControlExtensionの使用方法は、Graphic Control Extensionを付けるGIFの画像フレームをOwnerとしてCreateします。GIFは複数の画像をフレームとして保存でき、1つの画像だけを読み込んだ場合はImages[0]が読み込んだ画像になります。TGIFGraphicControlExtensionはGIFフレームが破棄される際に開放されるため、finally節で開放する必要はありません。
GCEを作成した後、そのTransparentプロパティをTrueに、TransparentColorプロパティに透過色を指定すると透過GIFとなります。この手法を使うと、TImageの代わりにTJPEGImage(Vcl.Imaging.JPEG)やPNGImage(Vcl.Imaging.PNGImage)を使ってJPEGファイルやPNGファイルを透過GIFに変換することができます。もちろん、非透過GIFをGIFImageへ直接読み込んで透過GIFに変換する際にも使えます。
|