三個主要的圖像相關接口是: 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;