首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

GDI+ 進階 (102):獲取所有圖像解碼器詳細信息

     編輯:Delphi

目標

枚舉系統註冊的所有 GDI+ 圖像解碼器,輸出其 CLSID、格式 ID、名稱、擴展名、MIME 類型、標志、簽名特徵等完整信息,用於診斷圖片加載支援情況。

核心 API

函數用途
GetImageDecodersSize(out NumDecoders, Size: Cardinal)獲取解碼器數量與總結構大小
GetImageDecoders(NumDecoders, Size: Cardinal; Decoders: PImageCodecInfo)填充解碼器信息陣列

TImageCodecInfo 結構字段全解

字段類型含義
ClsidTGUID解碼器類 ID (GUID)
FormatIDTGUID圖像格式 ID
CodecNamePWideChar解碼器名稱 (如 "Built-in JPEG Codec")
DllNamePWideChar所在 DLL 路徑,內建為空
FormatDescriptionPWideChar格式描述 (如 "JPEG")
FilenameExtensionPWideChar關聯擴展名 (分號分隔)
MimeTypePWideCharMIME 類型 (如 "image/jpeg")
FlagsDWORD能力標志組合 (見下表)
VersionDWORD版本號
SigCountDWORD簽名模式數量
SigSizeDWORD每個簽名字節數

Flags 常見值 (ImageCodecFlags)

  • 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.

典型輸出解讀 (Windows 10 內建)

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
...

實戰應用場景

  1. 運行時格式支援檢查:嘗試加載圖片前,先檢查擴展名/MIME 是否在解碼器列表中。
  2. 選擇最佳編碼器保存:根據目標格式 (如 PNG) 查找對應 Encoder Clsid,調用 Image.Save(..., EncoderClsid)。
  3. 診斷第三方編碼器:安裝專業編碼器 (如 JPEG 2000、WebP) 後,驗證是否正確註冊到 GDI+。
  4. 文件類型識別:讀取 SigCount/SigSize 簽名特徵,實現無擴展名文件格式識別。

配套:獲取編碼器列表 (對稱 API)


// 只需將 Decoders 改為 Encoders
GetImageEncodersSize(Num, Size);
GetMem(CodecInfo, Size);
GetImageEncoders(Num, Size, CodecInfo);
// 結構相同,Flags 含 Encoder 標志

總結

GetImageDecoders 是 GDI+ 運行時能力鏡像。掌握枚舉代碼模板、理解 TImageCodecInfo 每字段含義、識別 Flags 組合,即可在程序中動態適配圖片格式支援、選擇最優編碼參數、診斷編解碼器環境問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved