文档章节

再学 GDI+[103]: TGPImage(23) - 提取 GIF 动画的每一帧

涂孟超
 涂孟超
发布于 2014/09/26 15:31
字数 312
阅读 14
收藏 0
本例效果图:



代码文件:
unit Unit1;

interface

uses
  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.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 206
  ClientWidth = 339
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object ListBox1: TListBox
    Left = 0
    Top = 0
    Width = 89
    Height = 206
    Align = alLeft
    ItemHeight = 13
    TabOrder = 0
    OnClick = ListBox1Click
  end
  object Button1: TButton
    Left = 256
    Top = 173
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object OpenDialog1: TOpenDialog
    Left = 160
    Top = 104
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/07/16/1244232.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
[Android技术专题]动画知识概览

在Android应用开发中我们每天都在接触动画(Activity进入和退出、页面滑动、点击按钮等都有动画效果),但入门容易,真正做好很难。如果要把效果做得自然、看上去很爽需要你有一定的美感;如...

张明云
2016/09/10
0
0
实战开发:新手小白如何用C++制作经典网游DNF

十年前,那时候的网吧还不叫网咖,那时候没有王者荣耀也没有英雄联盟,那时候梦幻西游刚推出珍宝阁系统,那时候巫妖王的灵魂还封闭在冰封王座。 寻仙、穿越火线、征途、天龙八部……同时在线...

stone15165
2018/05/05
0
0
iOS中播放gif动态图的方式探讨

iOS中播放gif动态图的方式探讨 一、引言 在iOS开发中,UIImageView类专门来负责图片数据的渲染,并且UIImageView也有帧动画的方法来播放一组图片,但是对于gif类型的数据,UIImageView中并没...

珲少
2016/01/24
3.6K
1
PS制作心跳二维码动画 学会后能增加粉丝关注率哦

现在二维码到处都是,若想用户关注到你的二维码,必须搞点新花样才行哦,早期我们分享过「设计灵感:二维码也玩创意」一文,里面有很多不错的设计创意,然而有没有想过自己他创建一个可以长按...

commyleung
2018/03/16
0
0
APNG 动画图片分解工具 - APNG Disassembler

APNG Disassembler 是一款跨平台的小工具,在 Mac OS、Linux 以及 Windows 上都可以使用,不过除了 Windows 上有 GUI 界面外,其余的都只能使用命令行的形式。 APNG Disassembler 的使用方法...

匿名
06/13
344
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
12
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部