`
sogotobj
  • 浏览: 653855 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

GDI+ 在Delphi程序的应用 -- 多帧(页)图像动画播放

阅读更多

GDI+支持多种图像格式的操作,其中的gif和tiff格式图像可包含多帧(页)图片,在一般的显示中,只能显示图像的第一帧(页)图片。.NET专门有个ImageAnimator类,用来播放此类图像,在Delphi中,我们也可利用GDI+编制自己的多帧(页)图像动画播放类。

笔者写了一个多帧(页)图像动画播放类,为了代码重用,先写了一个基类TImageAnimatBase,下面是该类的源码,类的主要方法和属性已经在源码中说明:

unitImageAnimateBase;

...{***********************************************************}
...{}
...{TImageAnimatBase}
...{控制多帧图像动画显示,该类是一个基类}
...{}
...{方法:}
...{procedureSetDelays(ADelays:arrayofLongWord);}
...{设置各帧图像显示之间的延时时间。时间单位为毫秒}
...{ADelays数组各元素表示各帧图像的延时时间,如元素个数小于}
...{图像帧数,其余图像延时时间设置为ADelays最后一个元素的值,}
...{因此,如果需要所有图像同样的延时时间,可以这样设置:}
...{SetDelays([100]);}
...{元素个数大于图像帧数,多余的忽略;元素个数为0,则设置为缺}
...{省延时时间100,派生类可重载函数SetDefaultDelays改变缺省值}
...{}
...{procedureUpdateFrames;}
...{进入下一帧,更新图像在下次显示出来。该过程在Play=False}
...{时也能更新显示图像显示,且不受LoopCount限制}
...{}
...{属性:}
...{propertyCanAnimate:Boolean;}
...{只读,判断是否可动画播放。派生类可重载SetCanAnimate过程}
...{}
...{propertyFrameCount:Integer;}
...{只读,返回图像帧数}
...{}
...{propertyFrameIndex:Integer;}
...{只读,返回当前帧的索引号}
...{}
...{propertyLoopCount:Integer;}
...{动画播放循环次数。值为0无限循环,如果设置值小于0,则取}
...{缺省值0,可重载GetDefaultLoopCount函数改变缺省值}
...{}
...{propertyPlay:Boolean;}
...{播放和停止动画显示。每次播放时,帧索引和循环次数复位}
...{}
...{事件:}
...{propertyOnFrameChanged:TNotifyEvent;}
...{图像帧改变。必须响应该事件处理图像显示}
...{}
...{***********************************************************}

interface

uses
SysUtils,Classes,ExtCtrls;

type
TImageAnimatBase
=class(TObject)
private
FTimer:TTimer;
FDelays:PLongWord;
FLoopCount:Integer;
FLoopIndex:Integer;
FFrameCount:Integer;
FFrameIndex:Integer;
FOnFrameChanged:TNotifyEvent;
procedureTimerOnTimer(Sender:TObject);
functionGetPlay:Boolean;
procedureSetLoopCount(
constValue:Integer);
procedureSetPlay(
constValue:Boolean);
protected
procedureDoUpdateFrames;
virtual;
functionGetCanAnimate:Boolean;
virtual;
functionGetDefaultLoopCount:Integer;
virtual;
procedureSetDefaultDelays;
virtual;
procedureSetFrameCount(
constCount:Integer);

propertyDelays:PLongWordreadFDelays;
public
constructorCreate;
destructorDestroy;
override;
procedureSetDelays(ADelays:arrayofLongWord);
procedureUpdateFrames;

propertyCanAnimate:BooleanreadGetCanAnimate;
propertyFrameCount:IntegerreadFFrameCount;
propertyFrameIndex:IntegerreadFFrameIndex;
propertyLoopCount:IntegerreadFLoopCountwriteSetLoopCount;
propertyPlay:BooleanreadGetPlaywriteSetPlay;
propertyOnFrameChanged:TNotifyEventreadFOnFrameChangedwriteFOnFrameChanged;
end;

implementation

...{TImageAnimatBase}

constructorTImageAnimatBase.Create;
begin
FTimer:
=TTimer.Create(nil);
FTimer.Enabled:
=False;
FTimer.Interval:
=100;
FTimer.OnTimer:
=TimerOnTimer;
end;

destructorTImageAnimatBase.Destroy;
begin
FTimer.Free;
ifAssigned(FDelays)then
FreeMem(FDelays);
end;

procedureTImageAnimatBase.DoUpdateFrames;
begin
ifAssigned(OnFrameChanged)then
OnFrameChanged(Self);
Inc(FFrameIndex);
ifFrameIndex=FrameCountthen
begin
FFrameIndex:
=0;
if(LoopCount<>0)and(FLoopIndex<LoopCount)then
Inc(FLoopIndex);
end;
end;

functionTImageAnimatBase.GetCanAnimate:Boolean;
begin
Result:
=FrameCount>1;
end;

functionTImageAnimatBase.GetDefaultLoopCount:Integer;
begin
Result:
=0;
end;

functionTImageAnimatBase.GetPlay:Boolean;
begin
Result:
=FTimer.Enabled;
end;

procedureTImageAnimatBase.SetDefaultDelays;
var
I:Integer;
P:PLongWord;
begin
if not CanAnimate then Exit;
P:
=FDelays;
forI:=0toFrameCount-1do
begin
P
^:=100;
Inc(P);
end;
end;

procedureTImageAnimatBase.SetDelays(ADelays:arrayofLongWord);
var
I,Count:Integer;
P:PLongWord;
begin
ifnotCanAnimatethenExit;
Count:
=Length(ADelays);
ifCount=0then
begin
SetDefaultDelays;
Exit;
end;
P:
=FDelays;
forI:=0toFrameCount-1do
begin
ifI<Countthen
P
^:=ADelays[I]
else
P
^:=ADelays[Count-1];
Inc(P);
end;
end;

procedureTImageAnimatBase.SetFrameCount(
constCount:Integer);
begin
ifFFrameCount<>Countthen
begin
ifAssigned(FDelays)then
begin
FreeMem(FDelays);
FDelays:
=nil;
end;
FFrameCount:
=Count;
ifFFrameCount>1then
GetMem(FDelays,FFrameCount
*Sizeof(LongWord));
end;
end;

procedureTImageAnimatBase.SetLoopCount(
constValue:Integer);
begin
ifFLoopCount<>Valuethen
ifValue<0then
FLoopCount:
=GetDefaultLoopCount
else
FLoopCount:
=Value;
end;

procedureTImageAnimatBase.SetPlay(
constValue:Boolean);
begin
if(Play<>Value)and(notValueorCanAnimate)then
begin
ifValuethen
begin
FFrameIndex:
=0;
FLoopIndex:
=0;
end;
FTimer.Enabled:
=Value;
end;
end;

procedureTImageAnimatBase.TimerOnTimer(Sender:TObject);
var
P:PLongWord;
begin
P:
=FDelays;
Inc(P,FrameIndex);
ifP^<>FTimer.Intervalthen
FTimer.Interval:
=P^;
DoUpdateFrames;
if(FLoopCount<>0)and(FLoopIndex=LoopCount)then
Play:
=False;
end;

procedureTImageAnimatBase.UpdateFrames;
begin
ifCanAnimatethen
DoUpdateFrames;
end;

end.

下面是基于GDI+的TImageAnimatBase派生类TGpImageAnimator源码:

unitGpImageAnimate;

interface

uses
SysUtils,ActiveX,Gdiplus,ImageAnimateBase;

type
TGpImageAnimator
=class(TImageAnimatBase)
private
FImage:TGpImage;
FGUID:TGUID;
FDimensionTime:Boolean;
procedureSetFrameDimensionInfo;
procedureSetImage(
constValue:TGpImage);
protected
procedureDoUpdateFrames;
override;
functionGetDefaultLoopCount:Integer;
override;
procedureSetDefaultDelays;
override;
public
propertyImage:TGpImagereadFImagewriteSetImage;
end;

implementation

usesGdipTypes;

...{TGpImageAnimator}

procedureTGpImageAnimator.DoUpdateFrames;
begin
Image.SelectActiveFrame(FGUID,FrameIndex);
http://images.csdn.net/s
分享到:
评论

相关推荐

    图像动画系统-delphi图片调试程序..rar

    Delphi是一款强大的Windows应用程序开发工具,以其高效的编译器和直观的可视化界面设计闻名。它采用Object Pascal语言,为开发者提供了丰富的库支持,包括图形和图像处理。在图像动画系统中,Delphi的性能优势得以...

    《Delphi图形图像多媒体高级控件开发与应用》全书代码

    通过本书的代码实例,开发者可以掌握如何在Delphi环境下高效地构建具有专业级别的图形界面和多媒体功能的应用程序。无论是对个人开发者还是企业团队,掌握这些技术都将极大增强其在软件开发领域的竞争力。

    Delphi图像处理小程序

    Delphi是一种基于Object Pascal语言的集成开发环境,它以其高效性和灵活性在软件开发领域中备受推崇,尤其是在Windows平台上的桌面应用程序开发。本压缩包“Delphi图像处理小程序”集合了20个用Delphi编写的图像处理...

    Delphi实现动态GIF

    通过这样的实现,我们就可以在Delphi应用程序中播放动态GIF了。记得在处理GIF时要注意版权问题,尊重原创者的作品。 总之,Delphi提供了一种灵活的方式来处理动态GIF,无论是借助第三方库还是通过自定义代码。这...

    计算机软件-编程源码-Delphi图像演播技巧.zip

    本资料“计算机软件-编程源码-Delphi图像演播技巧.zip”显然包含了关于如何在Delphi中实现图像操作和播放的源代码示例。 1. 图像处理基础:在Delphi中,可以使用VCL(Visual Component Library)框架提供的TImage...

    Gif动画播放DLL

    它通过将多帧图像序列打包在一个文件中实现动画效果,且支持透明度,因此在网页设计、表情包制作等领域非常流行。 对于开发者来说,使用这个DLL意味着他们无需从头编写GIF解析和播放的代码,而是可以直接调用DLL...

    delphi简单的jpg特效

    如果想要为jpg图像添加动画效果,可以利用多帧图像(如GIF)或连续播放多张图片的方式实现。这需要控制TImage组件的Picture属性和Timer组件的Interval属性来实现动态效果。 7. **用户交互**: 用户可以通过鼠标...

    Delphi模式编程-光盘源代码.rar 刘艺

    6. **图形和多媒体**:Delphi支持GDI+和DirectX等图形库,可以处理图像、音频和视频。源代码中可能包含相关的图形绘制、动画制作或媒体播放的示例。 7. **事件驱动编程**:Delphi的事件驱动模型是其特色之一。源...

    Delphi7应用编程150例附书源码

    6. **图形与多媒体**:Delphi 7的GDI+库可以处理图形绘制、图像处理,甚至可以进行简单的动画制作。源码中可能包含音频、视频播放相关的示例。 7. **文件操作**:学习源码可以了解如何读写文件、处理XML、CSV等格式...

    Delphi7应用编程150例附书源码.rar

    5. **文件技术编程实例**:文件操作是任何应用程序的基础,Delphi提供了完善的文件I/O支持。实例可能包括文件的创建、读写、追加、删除,以及文件流操作。此外,还有可能涉及XML、JSON等数据格式的处理。 6. **网络...

    DELPHI编程,实现GIF播放

    在`Unit1.pas`中,你可能会找到设置`TGIFImage`属性和方法的代码,例如设置`TGIFImage.Source`为GIF文件路径,开启动画播放等。`Unit1.dpr`是项目的主程序文件,包含了项目的初始化和运行逻辑,这里可能包含了启动...

    重传《深入Delphi的多媒体编程》

    本书旨在帮助读者掌握如何利用Delphi的组件库和API函数来构建多媒体应用程序,包括音频、视频、图像处理等多个方面。在深入探讨的过程中,作者会介绍各种关键的多媒体技术,如DirectX、MCI(多媒体控制接口)以及GDI...

    一个带启动动画的Delphi信息系统界面..rar

    Delphi是一种强大的面向对象的编程环境,主要用于开发Windows桌面应用程序。这个名为"一个带启动动画的Delphi信息系统界面..rar"的压缩包很可能是包含了一个使用Delphi编写的信息化系统,该系统在启动时具有独特的...

    delphi 实现的一个动画效果

    5. **图像序列**:如果动画涉及多帧图像,如帧动画,可以使用数组或集合来存储每一帧的图像,然后按照指定的顺序和速度显示。 6. **自定义组件**:对于更复杂的效果,可能需要编写自定义组件。通过继承...

    Delphi课后练习程序源码集锦

    Delphi提供了绘图API,可以进行图像处理、动画制作,甚至音频和视频播放。通过实践,你可以学习如何使用GDI+或第三方库如TMediaPlayer来增强应用的视觉效果。 7. **错误处理和调试**: 了解如何正确处理异常和...

    Delphi深度历险范例程序源码

    6. **图形与多媒体**:Delphi支持GDI+和DirectX等图形库,源码可能包含图像处理、动画制作、音频播放等功能的实现。 7. **文件操作**:学习源码可以理解如何读写文件,包括文本文件、二进制文件、XML文件等,以及...

    Delphi应用编程150例

    《Delphi应用编程150例》是一本深入探讨Delphi编程实践的书籍,它涵盖了广泛的主题,旨在帮助开发者熟练掌握Delphi这一强大的Windows应用程序开发工具。Delphi以其高效的Object Pascal语言和直观的Visual Component ...

    gifimage(delphi).rar

    该控件允许开发者在他们的Delphi应用程序中轻松地显示和操作GIF动画。 GIFImage控件是基于Delphi的VCL(Visual Component Library)框架的,它为Delphi程序员提供了一种简单的方式来集成GIF图像和动画。这个控件...

    Delphi使用GifImage显示Gif动态图片.rar

    首先,`GifImage`是`TImage`控件的扩展,它增加了对GIF文件格式的支持,包括透明度、多帧动画等特性。在Delphi的VCL库中,你可以通过在工具箱中找到`GifImage`控件并将其拖放到窗体上来使用它。一旦添加到窗体,`...

    delphi gif动态图片

    通过以上步骤,你可以在Delphi应用程序中创建一个具有动态效果的GIF进度条。然而,需要注意的是,由于GIFImage组件的限制,它可能无法完美地处理某些复杂的GIF动画,如带有复杂透明效果的图像。在这种情况下,你可能...

Global site tag (gtag.js) - Google Analytics