GDI+ 能夠打開某種格式的圖像, 就會有對應的解碼器; 能夠保存為某種格式, 也會有對應的編碼器.
下面程序通過 IGPImageCodecInfoArray 與 IGPImageCodecInfo 獲取了 GDI+ 能夠編碼與解碼的格式:
uses GdiPlus;
procedure TForm1.Button1Click(Sender: TObject);
var
Encoders, Decoders: IGPImageCodecInfoArray;
Encoder, Decoder: IGPImageCodecInfo;
begin
Memo1.Clear;
Memo1.Lines.Add('可編碼格式:');
Encoders := TGPImageCodecInfo.GetImageEncoders;
for Encoder in Encoders do
begin
Memo1.Lines.Add(Encoder.FilenameExtension);
end;
Memo1.Lines.Add(EmptyStr);
Memo1.Lines.Add('可解碼格式:');
Decoders := TGPImageCodecInfo.GetImageDecoders;
for Decoder in Decoders do
begin
Memo1.Lines.Add(Decoder.FilenameExtension);
end;
end;
{ 結果如下:
可編碼格式:
*.BMP;*.DIB;*.RLE
*.JPG;*.JPEG;*.JPE;*.JFIF
*.GIF
*.TIF;*.TIFF
*.PNG
可解碼格式:
*.BMP;*.DIB;*.RLE
*.JPG;*.JPEG;*.JPE;*.JFIF
*.GIF
*.EMF
*.WMF
*.TIF;*.TIFF
*.PNG
*.ICO
}
編碼器(或解碼器)的所有屬性:
IGPImageCodecInfo.ClsId; { 統一的 GUID 標識 }
IGPImageCodecInfo.CodecName; { 名稱 }
IGPImageCodecInfo.DllName; { }
IGPImageCodecInfo.FilenameExtension; { 擴展名 }
IGPImageCodecInfo.Flags; { 標志 }
IGPImageCodecInfo.FormatDescription; { 格式描述 }
IGPImageCodecInfo.FormatId; { 格式 ID }
IGPImageCodecInfo.MimeType; { 類型 }
IGPImageCodecInfo.Version; { 版本 }
可以通過 TGPImageFormat 方便獲取指定類型的編碼器的統一 GUID 標識:
uses GdiPlus;
procedure TForm1.Button1Click(Sender: TObject);
var
E: IGPImageCodecInfo;
begin
with Memo1.Lines do
begin
Clear;
{ 通過 TGPImageCodecInfo 獲取編碼器的統一標識 }
for E in TGPImageCodecInfo.GetImageEncoders do
begin
Add(Format('%s - %s', [GUIDToString(E.ClsId), E.FormatDescription]));
end;
Add(EmptyStr);
{ 通過 TGPImageFormat 獲取指定格式的編碼器的統一標識 }
Add(Format('%s - BMP', [GUIDToString(TGPImageFormat.Bmp.CodecId)]));
Add(Format('%s - JPEG', [GUIDToString(TGPImageFormat.Jpeg.CodecId)]));
Add(Format('%s - GIF', [GUIDToString(TGPImageFormat.Gif.CodecId)]));
Add(Format('%s - TIFF', [GUIDToString(TGPImageFormat.Tiff.CodecId)]));
Add(Format('%s - PNG', [GUIDToString(TGPImageFormat.Png.CodecId)]));
end;
end;
(* 結果是一樣的:
{557CF400-1A04-11D3-9A73-0000F81EF32E} - BMP
{557CF401-1A04-11D3-9A73-0000F81EF32E} - JPEG
{557CF402-1A04-11D3-9A73-0000F81EF32E} - GIF
{557CF405-1A04-11D3-9A73-0000F81EF32E} - TIFF
{557CF406-1A04-11D3-9A73-0000F81EF32E} - PNG
{557CF400-1A04-11D3-9A73-0000F81EF32E} - BMP
{557CF401-1A04-11D3-9A73-0000F81EF32E} - JPEG
{557CF402-1A04-11D3-9A73-0000F81EF32E} - GIF
{557CF405-1A04-11D3-9A73-0000F81EF32E} - TIFF
{557CF406-1A04-11D3-9A73-0000F81EF32E} - PNG
*)
下面是把一個圖像文件分別保存(或叫編碼)為其他格式的例子:
uses GdiPlus;
procedure TForm1.Button1Click(Sender: TObject);
var
Image: IGPImage;
begin
ChDir('C:\GdiPlusImg\');
Image := TGPImage.Create('Bird.bmp');
Image.Save('Bird_Jpeg.jpg', TGPImageFormat.Jpeg);
Image.Save('Bird_Gif.gif', TGPImageFormat.Gif);
Image.Save('Bird_Tiff.tif', TGPImageFormat.Tiff);
Image.Save('Bird_Png.png', TGPImageFormat.Png);
Image.Save('Bird_Bmp.bmp', TGPImageFormat.Bmp);
end;
圖像編碼時還有一些參數, 譬如保存不同質量的 jpg(壓縮級別).