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

GDI+ 進階 (98):獲取圖像格式對應的 Encoder Clsid (GetEncoderClsid)

     編輯:Delphi

問題背景

GDI+ TGPImage.Save 需要編碼器 TGUID (CLSID),而非字串格式名。GDIPUTIL.GetEncoderClsid 封裝了「按 MIME 類型查找 Encoder CLSID」的邏輯,支援 5 種內建格式。

支援的 MIME 類型 (固定)

格式MIME 字串備註
BMPimage/bmp
JPEGimage/jpeg
GIFimage/gif
TIFFimage/tiff
PNGimage/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;

完整枚舉所有支援格式的 Clsid 代碼


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}

GetEncoderClsid 內部實現 (GDIPUTIL.pas 精簡)


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;

擴展:支援更多格式 (WebP, JPEG-XR, HEIC 等)

內建 GDI+ 不支援。需:

  1. 安裝對應 WIC (Windows Imaging Component) 編碼器。
  2. 或使用 OmniXML/Imaging、Skia4Delphi、Image32 等第三方純 Pascal/跨平台庫,它們內建或動態加載更多編碼器。

總結

GetEncoderClsid 是「字串格式 → 編碼器 GUID」的橋樑。**僅支援 5 種內建格式**,返回 Boolean 指示成敗。掌握其用法與局限,結合 GetImageEncoders 可在運行時動態發現環境支援的編碼能力,構建自適應的圖片保存功能。

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