載入任意支援格式圖片,一鍵導出為 PNG、JPEG、GIF、BMP、TIFF 五種常用格式,演示 GetEncoderClsid + TGPImage.Save 標準流程。
TGPImage.Create(FileName) 載入源圖 (自動識別格式)。GetEncoderClsid(MimeType, Clsid) 獲取編碼器 GUID。Img.Save(NewFileName, Clsid) 保存。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
btnOpen: TButton;
btnSaveAll: TButton;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnSaveAllClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses GDIPOBJ, GDIPAPI, GDIPUTIL;
const
// 目標格式 MIME 類型與擴展名對應
MimeTypes: array[0..4] of string = (
'image/png', 'image/jpeg', 'image/gif', 'image/bmp', 'image/tiff'
);
Extensions: array[0..4] of string = (
'.png', '.jpg', '.gif', '.bmp', '.tif'
);
var
GImg: TGPImage;
CurrentFile: string;
procedure TForm1.FormCreate(Sender: TObject);
begin
GImg := TGPImage.Create;
btnOpen.Caption := '打開圖片';
btnSaveAll.Caption := '批量導出 5 格式';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
GImg.Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Gr: TGPGraphics;
begin
if (CurrentFile <> '') and Assigned(GImg) then
begin
Gr := TGPGraphics.Create(Canvas.Handle);
try
Gr.DrawImage(GImg, 10, 10, GImg.GetWidth, GImg.GetHeight);
finally
Gr.Free;
end;
end;
end;
procedure TForm1.btnOpenClick(Sender: TObject);
begin
OpenDialog1.Filter := 'GDI+ 支援格式|*.png;*.jpg;*.jpeg;*.gif;*.bmp;*.tif;*.tiff|所有文件|*.*';
if OpenDialog1.Execute then
begin
CurrentFile := OpenDialog1.FileName;
GImg.Free;
GImg := TGPImage.Create(CurrentFile);
Caption := ExtractFileName(CurrentFile) + Format(' (%dx%d)', [GImg.GetWidth, GImg.GetHeight]);
Invalidate;
end;
end;
procedure TForm1.btnSaveAllClick(Sender: TObject);
var
i: Integer;
EncCLSID: TGUID;
NewName: string;
begin
if CurrentFile = '' then
begin
ShowMessage('請先打開圖片');
Exit;
end;
for i := 0 to High(MimeTypes) do
begin
if GetEncoderClsid(MimeTypes[i], EncCLSID) then
begin
NewName := ChangeFileExt(CurrentFile, Extensions[i]);
GImg.Save(NewName, EncCLSID);
end
else
ShowMessage('系統缺少編碼器: ' + MimeTypes[i]);
end;
Beep;
ShowMessage('導出完成!');
end;
end.
GetEncoderClsid 定義在 GDIPUTIL.pas 中,內部實現即枚舉編碼器匹配 MIME 類型 (見文章 101)。必須在 uses 添加 GDIPUTIL。
uses GDIPAPI, GDIPOBJ;
procedure SaveJpegWithQuality(const Img: TGPImage; const FileName: string; Quality: LongInt); // 0-100
var
EncCLSID: TGUID;
Params: TGPEncoderParameters;
Param: TGPEncoderParameter;
begin
GetEncoderClsid('image/jpeg', EncCLSID);
Params.Count := 1;
Param.GUID := EncoderQuality; // GDIPAPI 中定義的 GUID
Param.Type_ := EncoderParameterValueTypeLong;
Param.NumberOfValues := 1;
Param.Value := @Quality;
Params.Parameter[0] := Param;
Img.Save(FileName, EncCLSID, @Params);
end;
procedure SaveMultiPageTiff(const Images: array of TGPImage; const FileName: string);
var
EncCLSID: TGUID;
Params: TGPEncoderParameters;
Param: TGPEncoderParameter;
i: Integer;
begin
GetEncoderClsid('image/tiff', EncCLSID);
// 第一頁
Params.Count := 1;
Param.GUID := EncoderSaveFlag;
Param.Type_ := EncoderParameterValueTypeLong;
Param.NumberOfValues := 1;
Param.Value := @EncoderValueMultiFrame;
Params.Parameter[0] := Param;
Images[0].Save(FileName, EncCLSID, @Params);
// 中間頁
Param.Value := @EncoderValueFrameDimensionPage;
for i := 1 to High(Images) - 1 do
Images[i].Save(FileName, EncCLSID, @Params);
// 最後頁
Param.Value := @EncoderValueFlush;
Images[High(Images)].Save(FileName, EncCLSID, @Params);
end;
| 格式 | MIME | 擴展名 | 編碼器 | 解碼器 | 透明度 | 動畫 |
|---|---|---|---|---|---|---|
| PNG | image/png | .png | ✓ | ✓ | ✓ (Alpha) | ✗ (APNG 需擴展) |
| JPEG | image/jpeg | .jpg | ✓ | ✓ | ✗ | ✗ |
| GIF | image/gif | .gif | ✓ | ✓ | ✓ (1-bit) | ✓ |
| BMP | image/bmp | .bmp | ✓ | ✓ | ✗ (32位可存 Alpha 但少用) | ✗ |
| TIFF | image/tiff | .tif | ✓ | ✓ | ✓ | ✓ (多頁) |
GDI+ 格式轉換核心:**載入 → GetEncoderClsid(Mime) → Save(File, Clsid)**。配合 GDIPUTIL 封裝查找邏輯,即可實現任意支援格式互轉。進階參數 (EncoderParameters) 可控制 JPEG 質量、TIFF 多頁、PNG 壓縮級別等,滿足專業級圖片處理需求。