delphi TGPImage - 提取 GIF 动画的每一帧

2018-10-30



代码文件:


unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); procedure ListBox1Click(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}uses GDIPOBJ, GDIPAPI;var img: TGPImage; GifFrame, GifFrameCount: Word;procedure TForm1.FormCreate(Sender: TObject);begin OpenDialog1.Filter := 'GIF 文件|*.gif'; img := TGPImage.Create;end;procedure TForm1.FormDestroy(Sender: TObject);begin img.Free;end;procedure TForm1.Button1Click(Sender: TObject);var DimensionsCount: Integer; DimensionsIDs: PGUID; i: Integer;type ArrDimensions = array of TGUID;begin if not OpenDialog1.Execute then Exit; img.Free; img := TGPImage.Create(OpenDialog1.FileName); {获取 Gif 总帧数} DimensionsCount := img.GetFrameDimensionsCount; GetMem(DimensionsIDs, DimensionsCount * SizeOf(TGUID)); img.GetFrameDimensionsList(DimensionsIDs, DimensionsCount); GifFrameCount := img.GetFrameCount(ArrDimensions(DimensionsIDs)[0]); FreeMem(DimensionsIDs); Text := Format('共有 %d 帧', [GifFrameCount]); {显示帧列表} ListBox1.Clear; for i := 1 to GifFrameCount do ListBox1.Items.Add(Format('第 %d 帧', [i])); Repaint;end;procedure TForm1.FormPaint(Sender: TObject);var g: TGPGraphics;begin g := TGPGraphics.Create(Canvas.Handle); g.DrawImage(img, ListBox1.Width + 10, 10, img.GetWidth, img.GetHeight); g.Free;end;procedure TForm1.ListBox1Click(Sender: TObject);begin GifFrame := ListBox1.ItemIndex; img.SelectActiveFrame(FrameDimensionTime, GifFrame); Repaint;end;end.
阅读19