三个主要的图像相关接口是: IGPImage、IGPBitmap、IGPMetafile.
IGPBitmap、IGPMetafile 都是从 IGPImage 继承, 分别用于处理位图和图元文件.
还有从 IGPBitmap 继承的 IGPCachedBitmap 用于快速呈现图像.
IGPImage 的方法与属性:
//方法 IGPImage.Clone; { 克隆 } IGPImage.Save(); { 按指定格式保存到文件或流 } IGPImage.SaveAdd(); { 给许可多页的图像添加页 } IGPImage.GetPhysicalDimension(); { 获取图像的大小(宽、高) } IGPImage.GetBounds(); { 以指定单位获取图像的边界矩形 } IGPImage.GetThumbnailImage(); { 获取缩略图 } IGPImage.GetFrameDimensions; { 获取一个 GUID 数组, 每个 GUID 代表一帧 } IGPImage.GetFrameCount(); { 获取帧数 } IGPImage.SelectActiveFrame(); { 选择指定索引的帧为当前帧 } IGPImage.RotateFlip(); { 旋转图像 } IGPImage.GetPropertyItem(); { 获取属性项 } IGPImage.SetPropertyItem(); { 设置属性项 } IGPImage.RemovePropertyItem(); { 删除属性项 } IGPImage.GetEncoderParameterList(); { 获取图像编码器支持的参数信息 } //属性 IGPImage.ImageType; { 图像类型(Bitmap/Metafile/Unknown) } IGPImage.Width; { 宽度(单位是像素) } IGPImage.Height; { 高度(单位是像素) } IGPImage.HorizontalResolution; { 获取水平分辨率(以"像素/英寸"为单位) } IGPImage.VerticalResolution; { 获取垂直分辨率(以"像素/英寸"为单位) } IGPImage.Flags; { 获取图像像素的属性标志 } IGPImage.RawFormat; { 获取图像的文件格式 } IGPImage.PixelFormat; { 获取图像的像素格式 } IGPImage.Palette; { 获取或设置调色板 } IGPImage.PropertyIdList; { 获取图像属性 ID 数组 } IGPImage.PropertyItems; { 获取图像属性集合 }
IGPBitmap 在 IGPImage 的基础上添加的方法与属性:
//方法 IGPBitmap.GetHBitmap(); { 创建 GDI 格式的 Bitmap 并返回句柄 } IGPBitmap.GetHIcon; { 创建 Icon 文件并返回句柄 } IGPBitmap.LockBits(); { 锁定对象中内存中的像素数据 } IGPBitmap.UnlockBits(); { 解除 LockBits 的锁定 } IGPBitmap.SetResolution(); { 设置分辨率 } //属性 IGPBitmap.Pixels; { 获取或设置指定像素的颜色 }
IGPMetafile 在 IGPImage 的基础上添加的方法与属性:
//方法 IGPMetafile.GetMetafileHeader; { 获取 Metafile 的 MetafileHeader } IGPMetafile.GetHEnhMetafile; { 获取增强型 Metafile 的 Windows 句柄 } IGPMetafile.PlayRecord(); { 播放单个图元文件记录 } //属性 IGPMetafile.DownLevelRasterizationLimit; { }
还有几个图像相关的公共内联函数:
function GetPixelFormatSize(); { 返回指定像素格式的颜色深度(每个像素的位数) } function IsIndexedPixelFormat(); { 判断像素格式是否是索引的 } function IsAlphaPixelFormat(); { 判断像素格式是否包含 alpha 信息 } function IsCanonicalPixelFormat(); { 像素格式是否是每个像素 32 位(标准) } function IsExtendedPixelFormat(); { 像素格式是否是每个像素 64 位 }
另外还有 IGPImageAttributes 等多个辅助接口.
上面提到过的 IGPCachedBitmap 没有自己独有的方法和属性, 下面的例子是它和 IGPBitmap 的对比测试:
//测试结果是 CachedBitmap 比 Bitmap 快 3 倍左右. uses GdiPlus; procedure TForm1.Button1Click(Sender: TObject); const count = 1000; var Graphic: IGPGraphics; Bitmap: IGPBitmap; CachedBitmap: IGPCachedBitmap; t1,t2,x,y: Cardinal; i: Integer; begin Graphic := TGPGraphics.Create(Handle); Bitmap := TGPBitmap.Create('C:\GdiPlusImg\Texture.jpg'); CachedBitmap := TGPCachedBitmap.Create(Bitmap, Graphic); x := ClientWidth - Bitmap.Width; y := ClientHeight - Bitmap.Height; t1 := GetTickCount; for i := 0 to count - 1 do Graphic.DrawImage(Bitmap, Random(x), Random(y)); t1 := GetTickCount - t1; t2 := GetTickCount; for i := 0 to count - 1 do Graphic.DrawCachedBitmap(CachedBitmap, Random(x), Random(y)); t2 := GetTickCount - t2; Text := Format('%d : %d', [t1, t2]); end;