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

GDI+ 進階 (97):枚舉 GDI+ 支援的編碼/解碼圖像格式

     編輯:Delphi

目標

快速獲取當前系統 GDI+ 能編碼 (保存) 與解碼 (載入) 的所有圖像格式 MIME 列表,用於運行時格式支援檢查、文件過濾器構建、用戶提示。

對稱 API 雙調用


// 解碼器 (讀)
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.

典型輸出 (Windows 10 內建)

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

關鍵觀察

  • 編碼器 ⊆ 解碼器:能寫的格式必能讀,但能讀的不一定能寫 (EMF/WMF/ICO 僅解碼)。
  • 列表隨系統環境變化:安裝專業圖形軟件 (如 Adobe、CAD) 可能註冊額外 WIC 編碼器,列表會增長。
  • 構建文件過濾器:可根據此列表動態生成 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 唯讀。掌握枚舉模板、動態構建過濾器、運行時支援檢查,即可讓應用自適應環境編解碼能力,避免硬編碼格式列表導致的兼容性問題。

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