GDI+ TGPImage.Save 需要編碼器 TGUID (CLSID),而非字串格式名。GDIPUTIL.GetEncoderClsid 封裝了「按 MIME 類型查找 Encoder CLSID」的邏輯,支援 5 種內建格式。
| 格式 | MIME 字串 | 備註 |
|---|---|---|
| BMP | image/bmp | |
| JPEG | image/jpeg | |
| GIF | image/gif | |
| TIFF | image/tiff | |
| PNG | image/png |
注意:ICO、EMF、WMF 僅有解碼器,**無法用此函數獲取編碼器 CLSID**,保存需用其他庫。
uses GDIPUTIL; // 單元名稱
procedure TForm1.btnTestClick(Sender: TObject);
var
Clsid: TGUID;
begin
if GetEncoderClsid('image/png', Clsid) then
ShowMessage('PNG Encoder Clsid: ' + GUIDToString(Clsid))
else
ShowMessage('未找到 PNG 編碼器');
end;
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
end; var Form1: TForm1;
implementation {$R *.dfm} uses GDIPUTIL;
procedure TForm1.FormCreate(Sender: TObject);
var
List: TStringList;
Clsid: TGUID;
i: Integer;
begin
List := TStringList.Create;
try
List.Add('image/bmp');
List.Add('image/jpeg');
List.Add('image/gif');
List.Add('image/tiff');
List.Add('image/png');
Memo1.Clear;
for i := 0 to List.Count - 1 do
begin
if GetEncoderClsid(List[i], Clsid) then
Memo1.Lines.Add(Format('%s: {%s}', [List[i], GUIDToString(Clsid)]))
else
Memo1.Lines.Add(List[i] + ': NOT FOUND');
end;
finally
List.Free;
end;
end;
end.
image/bmp: {557CF400-1A04-11D3-9A73-0000F81EF32E}
image/jpeg: {557CF401-1A04-11D3-9A73-0000F81EF32E}
image/gif: {557CF402-1A04-11D3-9A73-0000F81EF32E}
image/tiff: {557CF405-1A04-11D3-9A73-0000F81EF32E}
image/png: {557CF406-1A04-11D3-9A73-0000F81EF32E}
function GetEncoderClsid(const MimeType: string; out Clsid: TGUID): Boolean;
var
Num, Size: Cardinal;
Info: PImageCodecInfo;
i: Integer;
Arr: array of TImageCodecInfo;
begin
Result := False;
GetImageEncodersSize(Num, Size);
if Size = 0 then Exit;
GetMem(Info, Size);
try
GetImageEncoders(Num, Size, Info);
for i := 0 to Num - 1 do
if SameText(Arr(Info)[i].MimeType, MimeType) then
begin
Clsid := Arr(Info)[i].Clsid;
Result := True;
Break;
end;
finally
FreeMem(Info);
end;
end;
內建 GDI+ 不支援。需:
GetEncoderClsid 是「字串格式 → 編碼器 GUID」的橋樑。**僅支援 5 種內建格式**,返回 Boolean 指示成敗。掌握其用法與局限,結合 GetImageEncoders 可在運行時動態發現環境支援的編碼能力,構建自適應的圖片保存功能。