快速獲取當前系統 GDI+ 能編碼 (保存) 與解碼 (載入) 的所有圖像格式 MIME 列表,用於運行時格式支援檢查、文件過濾器構建、用戶提示。
// 解碼器 (讀)
GetImageDecodersSize(Num, Size);
GetMem(Info, Size);
GetImageDecoders(Num, Size, Info);
// 遍歷 Info[i].MimeType
// 編碼器 (寫)
GetImageEncodersSize(Num, Size);
GetMem(Info, Size);
GetImageEncoders(Num, Size, Info);
// 遍歷 Info[i].MimeType
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 GDIPOBJ, GDIPAPI;
procedure TForm1.FormCreate(Sender: TObject);
var
Num, Size: Cardinal;
Info: PImageCodecInfo;
i: Integer;
Arr: array of TImageCodecInfo;
begin
Memo1.Clear;
Memo1.Lines.Add('=== GDI+ 可編碼格式 (保存) ===');
GetImageEncodersSize(Num, Size);
GetMem(Info, Size);
try
GetImageEncoders(Num, Size, Info);
for i := 0 to Num - 1 do
Memo1.Lines.Add(Arr(Info)[i].MimeType);
finally FreeMem(Info); end;
Memo1.Lines.Add('');
Memo1.Lines.Add('=== GDI+ 可解碼格式 (載入) ===');
GetImageDecodersSize(Num, Size);
GetMem(Info, Size);
try
GetImageDecoders(Num, Size, Info);
for i := 0 to Num - 1 do
Memo1.Lines.Add(Arr(Info)[i].MimeType);
finally FreeMem(Info); end;
end;
end.
=== GDI+ 可編碼格式 (保存) === image/bmp image/jpeg image/gif image/tiff image/png === GDI+ 可解碼格式 (載入) === image/bmp image/jpeg image/gif image/tiff image/png image/x-emf image/x-wmf image/x-icon
TOpenDialog.Filter 或 TSaveDialog.Filter。
function BuildImageFilter(ForSaving: Boolean): string;
var
Num, Size: Cardinal;
Info: PImageCodecInfo;
i: Integer;
Arr: array of TImageCodecInfo;
Exts, Desc: string;
begin
Result := '';
if ForSaving then
GetImageEncodersSize(Num, Size)
else
GetImageDecodersSize(Num, Size);
if Size = 0 then Exit;
GetMem(Info, Size);
try
if ForSaving then GetImageEncoders(Num, Size, Info)
else GetImageDecoders(Num, Size, Info);
for i := 0 to Num - 1 do
with Arr(Info)[i] do
begin
// FilenameExtension: "*.JPG;*.JPEG;*.JPE;*.JFIF"
Exts := StringReplace(FilenameExtension, ';', ';', [rfReplaceAll]);
Desc := FormatDescription; // "JPEG"
Result := Result + Format('%s (%s)|%s|', [Desc, Exts, Exts]);
end;
Result := Result + '所有文件 (*.*)|*.*|';
finally
FreeMem(Info);
end;
end;
雙 API 枚舉是 GDI+ 格式能力的「體檢報告」。**編碼器 5 種、解碼器 8 種 (內建)**,EMF/WMF/ICO 唯讀。掌握枚舉模板、動態構建過濾器、運行時支援檢查,即可讓應用自適應環境編解碼能力,避免硬編碼格式列表導致的兼容性問題。