枚舉系統註冊的所有 GDI+ 圖像解碼器,輸出其 CLSID、格式 ID、名稱、擴展名、MIME 類型、標志、簽名特徵等完整信息,用於診斷圖片加載支援情況。
| 函數 | 用途 |
|---|---|
GetImageDecodersSize(out NumDecoders, Size: Cardinal) | 獲取解碼器數量與總結構大小 |
GetImageDecoders(NumDecoders, Size: Cardinal; Decoders: PImageCodecInfo) | 填充解碼器信息陣列 |
| 字段 | 類型 | 含義 |
|---|---|---|
| Clsid | TGUID | 解碼器類 ID (GUID) |
| FormatID | TGUID | 圖像格式 ID |
| CodecName | PWideChar | 解碼器名稱 (如 "Built-in JPEG Codec") |
| DllName | PWideChar | 所在 DLL 路徑,內建為空 |
| FormatDescription | PWideChar | 格式描述 (如 "JPEG") |
| FilenameExtension | PWideChar | 關聯擴展名 (分號分隔) |
| MimeType | PWideChar | MIME 類型 (如 "image/jpeg") |
| Flags | DWORD | 能力標志組合 (見下表) |
| Version | DWORD | 版本號 |
| SigCount | DWORD | 簽名模式數量 |
| SigSize | DWORD | 每個簽名字節數 |
ImageCodecFlagsDecoder = 1:支持解碼ImageCodecFlagsEncoder = 2:支持編碼ImageCodecFlagsSupportBitmap = 4:支持位圖65543 = 1+2+4+65536 (Decoder+Encoder+Bitmap+內建)
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
btnEnum: TButton;
procedure FormCreate(Sender: TObject);
procedure btnEnumClick(Sender: TObject);
end;
var Form1: TForm1;
implementation {$R *.dfm} uses GDIPOBJ, GDIPAPI;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Align := alClient;
Memo1.ScrollBars := ssBoth;
Memo1.Font.Name := 'Consolas';
btnEnum.Caption := '枚舉解碼器';
end;
procedure TForm1.btnEnumClick(Sender: TObject);
var
Num, Size: Cardinal;
CodecInfo: PImageCodecInfo;
i: Integer;
Arr: array of TImageCodecInfo;
begin
GetImageDecodersSize(Num, Size);
GetMem(CodecInfo, Size);
try
GetImageDecoders(Num, Size, CodecInfo);
Memo1.Clear;
for i := 0 to Num - 1 do
with Memo1.Lines, Arr(CodecInfo)[i] do
begin
Add(Format('Clsid: {%s}', [GUIDToString(Clsid)]));
Add(Format('FormatID: {%s}', [GUIDToString(FormatID)]));
Add(Format('CodecName: %s', [CodecName]));
Add(Format('DllName: %s', [DllName]));
Add(Format('FormatDescription: %s', [FormatDescription]));
Add(Format('FilenameExtension: %s', [FilenameExtension]));
Add(Format('MimeType: %s', [MimeType]));
Add(Format('Flags: %d (Decoder:%s Encoder:%s Bitmap:%s)', [
Flags,
BoolToStr(Flags and 1 <> 0, True),
BoolToStr(Flags and 2 <> 0, True),
BoolToStr(Flags and 4 <> 0, True)
]));
Add(Format('Version: %d', [Version]));
Add(Format('SigCount: %d', [SigCount]));
Add(Format('SigSize: %d', [SigSize]));
Add('');
end;
finally
FreeMem(CodecInfo);
end;
end;
end.
Clsid: {557CF400-1A04-11D3-9A73-0000F81EF32E}
FormatID: {B96B3CAB-0728-11D3-9D7B-0000F81EF32E}
CodecName: Built-in BMP Codec
DllName:
FormatDescription: BMP
FilenameExtension: *.BMP;*.DIB;*.RLE
MimeType: image/bmp
Flags: 65543 (Decoder:True Encoder:True Bitmap:True)
Version: 1
SigCount: 1
SigSize: 2
Clsid: {557CF401-1A04-11D3-9A73-0000F81EF32E}
FormatID: {B96B3CAE-0728-11D3-9D7B-0000F81EF32E}
CodecName: Built-in JPEG Codec
...
FilenameExtension: *.JPG;*.JPEG;*.JPE;*.JFIF
MimeType: image/jpeg
Flags: 65543
SigCount: 1
SigSize: 2
Clsid: {557CF402-1A04-11D3-9A73-0000F81EF32E}
FormatID: {B96B3CB0-0728-11D3-9D7B-0000F81EF32E}
CodecName: Built-in GIF Codec
...
FilenameExtension: *.GIF
MimeType: image/gif
Flags: 65543
SigCount: 2
SigSize: 6
...
Image.Save(..., EncoderClsid)。SigCount/SigSize 簽名特徵,實現無擴展名文件格式識別。
// 只需將 Decoders 改為 Encoders
GetImageEncodersSize(Num, Size);
GetMem(CodecInfo, Size);
GetImageEncoders(Num, Size, CodecInfo);
// 結構相同,Flags 含 Encoder 標志
GetImageDecoders 是 GDI+ 運行時能力鏡像。掌握枚舉代碼模板、理解 TImageCodecInfo 每字段含義、識別 Flags 組合,即可在程序中動態適配圖片格式支援、選擇最優編碼參數、診斷編解碼器環境問題。