主页C++ Builder 资料C++ Builder 参考手册Pictures 图片TGIFImage
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
 • TBitmap
 • TGIFImage
 • TGraphic
 • TIcon
 • TJPEGImage
 • TMetafile
 • TPicture
 • TPngImage
 • TWICImage
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
TGIFImage - gif 图片/动画

说明:

TGIFImage: 处理 gif 图片和动画的显示和格式转换

 

头文件:

#include <Vcl.Imaging.GIFImg.hpp> (XE2 之后),#include <GIFImg.hpp> (XE 之前)

 

继承关系:

TObjectTPersistentTInterfacedPersistentTGraphicTGIFImage

 

属性:

属性 类型 描述
public:    
GlobalColorMap TGIFColorMap * gif 图片全局调色板【例1:显示 gif 全局调色板的内容
Version TGIFVersion gif 的版本,只读,可用的值为:
• gvUnknown:未知版本。在未加载任何文件,也没有图像数据的时候,是未知版本
• gv87a: 文件/图像数据的版本为 GIF87a
• gv89a: 文件/图像数据的版本为 GIF89a
Images TGIFImageList * gif 每一帧的数据【例:gif 的每一帧提取出来,每一帧存为一个 bmp 图片
ColorResolution int 颜色分辨率,只读属性,ColorResolution + 1 为颜色分辨率二进位位数,
修改 GlobalColorMap 属性里面的颜色个数,ColorResolution 会随着改变。
• 例1:如果 ColorResolution = 4,那么为 5 位的颜色分辨率,2⁵ = 32,那么这个 gif 图片最多有 32 种颜色。
• 例2:修改 GlobalColorMap 让里面有 100 个颜色,100 转为二进制需要至少 7 位二进制位来表达,那么 ColorResolution 会变成 6。
例1:显示 gif 全局调色板的内容
BitsPerPixel int 每个像素的最大二进位位数,只读属性,一般情况,会等于 ColorResolution + 1
这个属性的值会自动根据调色板里面颜色个数来调整。
BackgroundColorIndex Byte gif 图片的背景色在调色板里面的索引号
BackgroundColor TColor gif 图片的背景色的颜色值
AspectRatio Byte 这个 gif 图片的宽高比。
=0: 宽高比为 1:1
≠0: 宽高比为 (AspectRatio + 15) / 64.0,范围在 1:4 到 4:1 之间
    例如 1 对应于 1:4 (0.25); 241 对应于 4:1 (4.0)
IsTransparent bool 这个 gif 图片是否存在透明部分,只读属性
DrawBackgroundColor TColor 显示这个 gif 图片的窗口的背景颜色
ColorReduction TColorReduction 从其他图片格式导入 gif 图片的时候,如何处理颜色消减,可读写,可用的值:
• rmNone: 不处理颜色消减
• rmWindows20: 使用 Windows 操作系统的 20 色系统调色板
• rmWindows256: 使用 Windows 操作系统的 256 色半色调调色板。
• rmWindowsGray: 使用 Windows 操作系统的 4 个灰度颜色。
• rmMonochrome: 使用只有黑白两种颜色的调色板。
• rmGrayScale: 使用 256 级灰度调色板。
• rmNetscape: 使用 Netscape 216 种颜色的调色板。
• rmQuantize: 使用最佳化的 2ⁿ 种颜色的调色板。
• rmQuantizeWindows: 使用最佳化的 256 种颜色的 Windows 调色板。
• rmPalette: 使用自定义的调色板。
ReductionBits int 当 ColorReduction 属性为 rmQuantize 的时候,这个属性表示每个像素的二进位位数,可读写属性。
DitherMode TDitherMode 抖动算法 (数字半色调算法),可读写属性。可用的值为:
• dmNearest: 使用接近的颜色替代;
• dmFloydSteinberg: 使用 Floyd-Steinberg error diffusion 抖动算法;
• dmStucki: 使用 Stucki error diffusion 抖动算法;
• dmSierra: 使用 Sierra error diffusion 抖动算法;
• dmJaJuNI: 使用 Jarvis, Judice, and Ninke error diffusion 抖动算法;
• dmSteveArche: 使用 Stevenson and Arche error diffusion 抖动算法;
• dmBurkes: 使用 Burkes error diffusion 抖动算法。
AnimationSpeed int 显示动画的速度,可读写,0 ~ 1000,单位:%
100 为正常速度 (100%),数值越大,速度越快【例:显示 gif 图片和动画
Animate bool 是否显示动画,可读写【例:显示 gif 图片和动画
AnimateLoop TGIFAnimationLoop gif 动画每一帧循环显示的方式,可读写,可用的值为:
• glDisabled: 不循环显示
• glEnabled: 按照图片内部存储的循环方式
• glContinously: 循环显示,忽略图片内部存储的循环方式
Dithering TGIFDithering 显示 gif 的时候是否使用抖动算法 (数字半色调算法),可读写属性。可用的值为:
• gdDisabled: 使用 Netscape 216 种颜色调色板的时候不采用抖动算法;
• gdEnabled: 使用 Netscape 216 种颜色调色板的时候采用抖动算法;
• gdAuto: 使用 Netscape 216 种颜色调色板的时候,只有在 DC (device context) 支持的颜色少于 256 种颜色的时候使用抖动算法。
ShouldDither bool 显示 gif 的时候需要使用抖动算法 (数字半色调算法),只读属性。
Bitmap TBitmap gif 里面的第一帧图像,相当于 Images->Frames[0] 里面的图像数据。
TGraphic::   TGraphic 继承过来的
Empty bool 是否包含图像数据,只读。如果不包含图像数据,此属性为 true.
Height int 图像的高度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
Modified bool 图像是否被修改过。如果被修改过,此属性为 true.
Palette HPALETTE 调色板句柄,可读写。如果图片没有或者不需要调色板,此值为 NULL
PaletteModified bool 调色板是否被修改过,如果被修改过,此属性值为 true.
Transparent bool 图像是否存在透明部分,可读写。
Width int 图像的宽度,可读写,单位:像素 (pixels)
可以用 SetSize 方法同时修改宽度和高度
SupportsPartialTransparency bool 是否支持半透明或 Alpha 通道,只读属性。

 

方法:

方法 描述
public:  
TGIFImage __fastcall virtual TGIFImage(void);
构造函数。
~TGIFImage __fastcall virtual ~TGIFImage(void);
析构函数。
Dormant void __fastcall Dormant(void);
C++ Builder 的帮助里面 Dormant 没有写任何内容,在 TGIFImage 的源码里面看到 Dormant 函数的内容为:FreeBitmap; FreeMask; FreePalette; 即:释放位图、蒙板和调色板占用的资源。
LoadFromStream virtual void __fastcall LoadFromStream(System::Classes::TStream* Stream);
从流加载 gif 图片/动画。
SaveToStream virtual void __fastcall SaveToStream(System::Classes::TStream* Stream);
保存当前的 gif 数据到流。
Add TGIFFrame* __fastcall Add(System::Classes::TPersistent* Source);
把 Source 的内容添加到当前的 gif 数据。如果 Source 是 TGIFImage 会添加 Source 里面所有的帧到当前数据,如果是 TBitmap, TIcon, TJPEGImage, TPngImage 等其他从 TGraphic 继承的类,会添加一帧图像数据。
Pack void __fastcall Pack(void);
清空 gif 所有的图像数据和调色板数据。
OptimizeColorMap void __fastcall OptimizeColorMap(void);
优化调色板数据。
Optimize void __fastcall Optimize(TGIFOptimizeOptions Options, TColorReduction ColorReduction = (TColorReduction)(0x0), TDitherMode DitherMode = (TDitherMode)(0x0), int ReductionBits = 0x8);
优化图像数据。
Options: 可以包含下面的一项或多项内容:
• ooCrop: 裁剪动画帧
• ooMerge: 合并相同颜色的像素
• ooCleanup: 移除注释和应用扩展
• ooColorMap: 调色板颜色排序,移除没有用到的项目
ColorReduction: 颜色消减,可以使用的值:
• rmNone: 不处理颜色消减
• rmWindows20: 使用 Windows 操作系统的 20 色系统调色板
• rmWindows256: 使用 Windows 操作系统的 256 色半色调调色板。
• rmWindowsGray: 使用 Windows 操作系统的 4 个灰度颜色。
• rmMonochrome: 使用只有黑白两种颜色的调色板。
• rmGrayScale: 使用 256 级灰度调色板。
• rmNetscape: 使用 Netscape 216 种颜色的调色板。
• rmQuantize: 使用最佳化的 2ⁿ 种颜色的调色板。
• rmQuantizeWindows: 使用最佳化的 256 种颜色的 Windows 调色板。
• rmPalette: 使用自定义的调色板。
DitherMode: 抖动算法 (数字半色调算法)
• dmNearest: 使用接近的颜色替代;
• dmFloydSteinberg: 使用 Floyd-Steinberg error diffusion 抖动算法;
• dmStucki: 使用 Stucki error diffusion 抖动算法;
• dmSierra: 使用 Sierra error diffusion 抖动算法;
• dmJaJuNI: 使用 Jarvis, Judice, and Ninke error diffusion 抖动算法;
• dmSteveArche: 使用 Stevenson and Arche error diffusion 抖动算法;
• dmBurkes: 使用 Burkes error diffusion 抖动算法。
ReductionBits: ColorReduction 为 rmQuantize 的时候,每个像素的二进位位数
Clear void __fastcall Clear(void);
清空 gif 所有的图像数据。
Warning virtual void __fastcall Warning(System::TObject* Sender, TGIFSeverity Severity, const System::UnicodeString Msg);
触发一个 OnWarning 事件。
Severity 可以使用的值:
• gsInfo: 这只是一个提示信息,不触发异常。
• gsWarning: 这是一个警告 (不严重的问题),不触发异常。
• gsError: 这是一个错误 (严重的问题),会触发抛出 GIFException 异常。
Assign virtual void __fastcall Assign(System::Classes::TPersistent *Source);
把 Source 图像内容复制到当前的 gif,如果 Source 不是 TGIFImage,而是 TBitmap, TIcon, TJPEGImage, TPngImage 等其他从 TGraphic 继承的类,会把数据复制到 gif 的第一帧图像数据。
LoadFromClipboardFormat virtual void __fastcall LoadFromClipboardFormat(System::Word AFormat, NativeUInt AData, HPALETTE APalette);
从剪贴板加载图像数据,AFormat 为剪贴板数据格式,例如 CF_BITMAP,AData 为图像数据,APalette 为调色板句柄。【请参考 TBitmap 的例子:从剪贴板加载位图
SaveToClipboardFormat virtual void __fastcall SaveToClipboardFormat(System::Word &AFormat, NativeUInt &AData, HPALETTE &APalette);
把当前的图像数据转为剪贴板格式的数据,可以把这些数据放入剪贴板。
【请参考 TBitmap 的例子:把位图放在剪贴板里面
EffectiveBackgroundColor System::Uitypes::TColor __fastcall EffectiveBackgroundColor(void);
返回显示这个 gif 的窗口的背景颜色。
StopDraw void __fastcall StopDraw(void);
停止显示输出。如果这个 gif 是一个动画,会停止播放。
SuspendDraw void __fastcall SuspendDraw(void);
暂停显示输出。如果这个 gif 是一个动画,会暂停播放。
ResumeDraw void __fastcall ResumeDraw(void);
继续显示输出。如果这个 gif 是一个动画,会继续播放。
Equals inline bool __fastcall Equals(System::TObject* Obj){ return Vcl::Graphics::TGraphic::Equals(Obj); }
比较当前图像是否和 Obj 的图像数据相同。
TGraphic:: TGraphic 继承过来的
LoadFromFile virtual void __fastcall LoadFromFile(const System::UnicodeString Filename);
从文件加载图像。
SaveToFile virtual void __fastcall SaveToFile(const System::UnicodeString Filename);
把当前图像储存为文件。
SetSize virtual void __fastcall SetSize(int AWidth, int AHeight);
修改图像的大小为:宽度 = AWidth,高度 = AHeight,单位为像素 (pixels)
operator
_di_IStreamPersist()
operator System::Classes::_di_IStreamPersist()
{
  System::Classes::_di_IStreamPersist intf;
  this->GetInterface(intf);
  return intf;
}
类型转换操作符,转为 _di_IStreamPersist 类型。
protected:  
GetHeight virtual int __fastcall GetHeight(void);
返回图像的高度,单位:像素 (pixels)。
SetHeight virtual void __fastcall SetHeight(int Value);
把图像高度修改为 Value,单位:像素 (pixels)
GetWidth virtual int __fastcall GetWidth(void);
返回图像的宽度,单位:像素 (pixels)。
SetWidth virtual void __fastcall SetWidth(int Value);
把图像宽度修改为 Value,单位:像素 (pixels)
AssignTo virtual void __fastcall AssignTo(System::Classes::TPersistent* Dest);
Draw virtual void __fastcall Draw(Vcl::Graphics::TCanvas* ACanvas, const System::Types::TRect &Rect);
把当前图像数据显示到画布 ACanvas 的 Rect 位置。
Equals virtual bool __fastcall Equals(Vcl::Graphics::TGraphic* Graphic)/* overload */;
比较当前图像是否和 Obj 的图像数据相同。
GetPalette virtual HPALETTE __fastcall GetPalette(void);
返回调色板句柄。
SetPalette virtual void __fastcall SetPalette(HPALETTE Value);
调色板改为使用 Value 句柄的调色板。
GetEmpty virtual bool __fastcall GetEmpty(void);
返回图像数据是否为空。
WriteData virtual void __fastcall WriteData(System::Classes::TStream* Stream);
把图像数据写到 Stream 里面
GetIsTransparent bool __fastcall GetIsTransparent(void);
为 IsTransparent 属性调用的函数,获取 gif 图片是否存在透明部分。
GetVersion TGIFVersion __fastcall GetVersion(void);
为 Version 属性调用的函数,返回 gif 图片的版本:
• gvUnknown:未知版本。在未加载任何文件,也没有图像数据的时候,是未知版本
• gv87a: 文件/图像数据的版本为 GIF87a
• gv89a: 文件/图像数据的版本为 GIF89a
GetColorResolution int __fastcall GetColorResolution(void);
为 ColorResolution 属性调用的函数,返回颜色分辨率,详见 ColorResolution 属性。
GetBitsPerPixel int __fastcall GetBitsPerPixel(void);
为 BitsPerPixel 属性调用的函数,返回每个像素的最大二进位位数,详见 BitsPerPixel 属性。
GetBackgroundColorIndex System::Byte __fastcall GetBackgroundColorIndex(void);
为 BackgroundColorIndex 属性调用的函数,返回 gif 图片的背景色在调色板里面的索引号。
SetBackgroundColorIndex void __fastcall SetBackgroundColorIndex(const System::Byte Value);
为 BackgroundColorIndex 属性调用的函数,把 gif 图片的背景色在调色板里面的索引号改为 Value。
GetBackgroundColor System::Uitypes::TColor __fastcall GetBackgroundColor(void);
为 BackgroundColor 属性调用的函数,返回 gif 图片的背景色的颜色值。
SetBackgroundColor void __fastcall SetBackgroundColor(const System::Uitypes::TColor Value);
为 BackgroundColor 属性调用的函数,把 gif 图片的背景色的颜色值改为 Value。
GetAspectRatio System::Byte __fastcall GetAspectRatio(void);
为 AspectRatio 属性调用的函数,返回图片的宽高比,详见 AspectRatio 属性。
SetAspectRatio void __fastcall SetAspectRatio(const System::Byte Value);
为 AspectRatio 属性调用的函数,把图片的宽高比改为 Value,详见 AspectRatio 属性。
SetAnimationSpeed void __fastcall SetAnimationSpeed(int Value);
为 AnimationSpeed 属性调用的函数,返回显示动画的速度,详见 AnimationSpeed 属性。
SetReductionBits void __fastcall SetReductionBits(int Value);
为 ReductionBits 属性调用的函数,详见 ReductionBits 属性。
NewImage void __fastcall NewImage(void);
TGIFImage 内部调用的方法,为 InternalClear 方法调用。
GetBitmap Vcl::Graphics::TBitmap* __fastcall GetBitmap(void);
为 Bitmap 属性调用,返回 gif 的第一帧图像详见 Bitmap 属性。
NewBitmap Vcl::Graphics::TBitmap* __fastcall NewBitmap(void);
创建一个新的空白位图,为 TGIFImage 内部调用的函数。
FreePalette void __fastcall FreePalette(void);
释放调色板占用的资源。
FreeBitmap void __fastcall FreeBitmap(void);
释放 TGIFImage 内部储存的位图资源。
GetColorMap TGIFColorMap* __fastcall GetColorMap(void);
返回当前 gif 图像的调色板。
GetDoDither bool __fastcall GetDoDither(void);
为 ShouldDither 属性调用的方法,返回显示 gif 的时候需要使用抖动算法 (数字半色调算法)。
InternalClear void __fastcall InternalClear(void);
复位 TGIFImage 实例的数据,是 TGIFImage 内部调用的函数。
SetAnimate void __fastcall SetAnimate(const bool Value);
为 Animate 属性调用的方法,把是否显示动画改为 Value,详见 Animate 属性。
SetAnimateLoop void __fastcall SetAnimateLoop(const TGIFAnimationLoop Value);
为 AnimateLoop 属性调用的方法,把循环显示的方式 改为 Value,详见 AnimateLoop 属性。
SetDithering void __fastcall SetDithering(const TGIFDithering Value);
为 Dithering 属性调用的方法,把是否使用抖动算法改为 Value,详见 Dithering 属性。
SetTransparent virtual void __fastcall SetTransparent(bool Value);
设为是否需要把图像显示为透明。
CreateRenderer virtual TCustomGIFRenderer* __fastcall CreateRenderer(void);
TGraphic:: TGraphic 继承过来的
Changed virtual void __fastcall Changed(System::TObject* Sender);
当图像数据被修改的时候,会自动调用 Changed 方法。
Changed 方法会把 Modified 属性置为 true,并且触发 OnChange 事件。
DefineProperties virtual void __fastcall DefineProperties(System::Classes::TFiler* Filer);
重载 TPersistent 的 DefineProperties,用于 ReadData 和 WriteData 方法读写流图像数据。
DrawTransparent virtual void __fastcall DrawTransparent(TCanvas* ACanvas, const System::Types::TRect &Rect, System::Byte Opacity);
把当前图像数据显示到画布 ACanvas 的 Rect 位置,和画布 Rect 位置原来的显示内容混合在一起,Opacity 为混合的比例,用来实现图像的透明效果,即 Opacity 为图像不透明的程度。
GetTransparent virtual bool __fastcall GetTransparent(void);
返回图像是否存在透明部分。
Progress DYNAMIC void __fastcall Progress(System::TObject* Sender, TProgressStage Stage, System::Byte PercentDone, bool RedrawNow, const System::Types::TRect &R, const System::UnicodeString Msg);
当图像改变时 (加载、存储、转换的过程中),会调用这个方法来触发 OnProgress 事件。
ReadData virtual void __fastcall ReadData(System::Classes::TStream* Stream);
从 Stream 里面读取图像数据。
GetSupportsPartialTransparency virtual bool __fastcall GetSupportsPartialTransparency(void);
返回是否支持半透明或 Alpha 通道。

 

事件:

事件 描述
public:  
OnWarning __property TGIFWarning OnWarning = {read=FOnWarning, write=FOnWarning};
typedef void __fastcall (__closure *TGIFWarning)(System::TObject* Sender, TGIFSeverity Severity, const System::UnicodeString Msg);
处理 gif 的过程中出现了错误,或者有提示与警告信息。
Severity 参数可能出现的值:
• gsInfo: 这只是一个提示信息,不触发异常。
• gsWarning: 这是一个警告 (不严重的问题),不触发异常。
• gsError: 这是一个错误 (严重的问题),会触发抛出 GIFException 异常。
Msg 参数的值为错误提示或警告信息。
OnPaint __property System::Classes::TNotifyEvent OnPaint = {read=FOnPaint, write=FOnPaint};
渲染 (显示输出) gif 图像的时候触发的事件。
OnStartPaint __property System::Classes::TNotifyEvent OnStartPaint = {read=FOnStartPaint, write=FOnStartPaint};
开始渲染 (显示输出) gif 图像的时候触发的事件。
OnEndPaint __property System::Classes::TNotifyEvent OnEndPaint = {read=FOnEndPaint, write=FOnEndPaint};
结束渲染 (显示输出) gif 图像的时候触发的事件。
OnAfterPaint __property System::Classes::TNotifyEvent OnAfterPaint = {read=FOnAfterPaint, write=FOnAfterPaint};
渲染完成之后触发的事件。
OnLoop __property System::Classes::TNotifyEvent OnLoop = {read=FOnLoop, write=FOnLoop};
循环播放的时候触发的事件。
TGraphic:: TGraphic 继承过来的
OnChange __property System::Classes::TNotifyEvent OnChange = {read=FOnChange, write=FOnChange};
• 当加载的图像发生变化时产生的事件,如果正在显示这个图片,需要刷新显示。
• 对于 gif 动画,需要显示下一帧的时候,会产生这个事件,需要在这个事件里面刷新显示
例:直接在画布上显示 gif 动画
OnProgress __property TProgressEvent OnProgress = {read=FOnProgress, write=FOnProgress};
当加载、存储、转换的过程中,会产生这个事件,表示这个过程的进度。

 

例1:显示 gif 全局调色板的内容

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  std::auto_ptr<TGIFImage>gif(new TGIFImage);
  gif->LoadFromFile(L"d:\\test.gif");
  UnicodeString s;
  int iColorResolution = gif->ColorResolution;
  int iMaxColorCount = 1 << (iColorResolution + 1); // uǝɥɔ ɹoʇɔıʌ - /ɯoɔ·suɐɟddɔ·ʍʍʍ//:dʇʇɥ
  Memo1->Lines->Add(s.sprintf(L"ColorResolution = %d", iColorResolution));
  Memo1->Lines->Add(s.sprintf(L"最大颜色个数 = %d", iMaxColorCount));
  Memo1->Lines->Add(s.sprintf(L"调色板里面颜色个数 = %d", gif->GlobalColorMap->Count));
  Memo1->Lines->Add(L"颜色号: 红, 绿, 蓝");
  for(int i=0; i<gif->GlobalColorMap->Count; i++)
   {
     TGIFColor c = gif->GlobalColorMap->Color2RGB(gif->GlobalColorMap->Colors[i]);
     Memo1->Lines->Add(s.sprintf(L"%3d: %3d, %3d, %3d", i, c.Red, c.Green, c.Blue));
   }
}

 

相关链接:

jpg, gif, png, bmp 之间的格式转换
bmp 转 gif 图片和动画
显示 gif 图片和动画
gif 的每一帧提取出来,每一帧存为一个 bmp 图片
屏幕截图

◤上一页:TBitmap下一页:TGraphic

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号