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

GDI+ 進階 (99):TGPImage 圖片格式轉換保存 (多格式批量導出)

     編輯:Delphi

目標

載入任意支援格式圖片,一鍵導出為 PNG、JPEG、GIF、BMP、TIFF 五種常用格式,演示 GetEncoderClsid + TGPImage.Save 標準流程。

核心流程

  1. TGPImage.Create(FileName) 載入源圖 (自動識別格式)。
  2. 對每種目標格式,調用 GetEncoderClsid(MimeType, Clsid) 獲取編碼器 GUID。
  3. 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.

關鍵輔助單元:GDIPUTIL

GetEncoderClsid 定義在 GDIPUTIL.pas 中,內部實現即枚舉編碼器匹配 MIME 類型 (見文章 101)。必須在 uses 添加 GDIPUTIL。

進階:JPEG 質量控制


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;

進階:TIFF 多頁保存


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擴展名編碼器解碼器透明度動畫
PNGimage/png.png✓✓✓ (Alpha)✗ (APNG 需擴展)
JPEGimage/jpeg.jpg✓✓✗✗
GIFimage/gif.gif✓✓✓ (1-bit)✓
BMPimage/bmp.bmp✓✓✗ (32位可存 Alpha 但少用)✗
TIFFimage/tiff.tif✓✓✓✓ (多頁)

總結

GDI+ 格式轉換核心:**載入 → GetEncoderClsid(Mime) → Save(File, Clsid)**。配合 GDIPUTIL 封裝查找邏輯,即可實現任意支援格式互轉。進階參數 (EncoderParameters) 可控制 JPEG 質量、TIFF 多頁、PNG 壓縮級別等,滿足專業級圖片處理需求。

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