Delphi による画像ファイルの表示とファイル形式変換

 Delphiで使用できる画像ファイル形式です。
ビットマップ形式のファイルは、一応標準で組み込まれていますが他の形式に関しては、USESにユニットを追加して使用します。
変換先のファイル形式によっては、画質が低下します。

GDI+によるファイル変換(GDI+ Windows XPから組み込まれています)

拡張子の種類名称保存
BMPビットマップ可能
GIFギフ 複数フレーム対応可能
JPG,JPEGジェイペグ可能
PNGピング可能
TIF,TIFFティフ 複数フレーム対応可能
PNGピング可能
WMFウィンドウズメタファイル不可
EMFエンハンスドメタファイル不可
EMF+エンハンスドメタファイルプラス不可
ICO,ICONアイコン不可

Windows Imaging Componentによるファイル変換(WIC Windows Vista XPSP3 以降)

拡張子の種類名称保存
BMPビットマップ 可能
GIFギフ 複数フレーム対応可能
JPG,JPEGジェイペグ可能
PNGピング可能
TIF,TIFFティフ 複数フレーム対応可能
PNGピング可能
HDP,WDPHD photo可能
ICO,ICONアイコン不可

専用unit使用による変換

ユニット名ファイルの種類
JPEGJPG,JPEG
GifImgGIF
PngImagePNG

標準 TImageその他 (TIF,TIFF標準で読み込めますがWIC経由となります)

拡張子の種類名称保存
BMP,DIBビットマップ,ディーアイビー可能
WMFウィンドウズメタファイル不可
EMFエンハンスドメタファイル不可
TIF,TIFFティフ(WIC経由)不可
ICO,ICONアイコン不可

FMXによるファイル変換

拡張子の種類名称保存
BMPビットマップ可能
JPG,JPEGジェイペグ可能
TIF,TIFFティフ可能
GIFギフ可能
PNGピング可能
WMPwmpファイル()
ICO,ICONアイコン不可

() Windows Media photo のフォーマットですが、一般的なアプリケーションで全く採用されていないのて確認が取れません。

参考 Windows Paintによるファイル変換

拡張子の種類名称保存
BMP,DIBビットマップ,ディーアイビー可能
JPG,JPEGジェイペグ可能
GIFギフ可能
TIF,TIFFティフ可能
PNGピング可能
ICO,ICONアイコン不可

 

WIC使用プログラム例

//-----------------------------------------------------------------------------------------
// WICを使用して画像ファイル形式を変換して保存するプログラムです。
// 一度TBitmapのビットマップ形式に変換していますが、TBitmapに変換しなくても変換は可能です。
// ビットマップ形式に変換は、単に画像処理が出来るようにするためです。
//-----------------------------------------------------------------------------------------
unit WicFileConv;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtDlgs, Vcl.StdCtrls, Vcl.ExtCtrls, system.UITypes;

type
  TForm1 = class(TForm)
    FileOpenBtn: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    FileSaveBtn: TButton;
    SavePictureDialog1: TSavePictureDialog;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    Panel1: TPanel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    magnificationEdit: TLabeledEdit;
    ReDisplay: TButton;
    procedure FileOpenBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FileSaveBtnClick(Sender: TObject);
    procedure ReDisplayClick(Sender: TObject);
  private
    { Private 宣言 }
    procedure Imageout(Image: TBitmap);
    procedure trimming_imageout(Image: TBitmap);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  OpenFileFilter =
    '画像ファイル|*.png;*.jpg;*.gif;*.bmp;*.tif;*.ico;*.wdp'+
    '|*.png|*.png' +
    '|*.jpg|*.jpg' +
    '|*.gif|*.gif' +
    '|*.bmp|*.bmp' +
    '|*.tif|*.tif' +
    '|*.ico|*.ico' +
    '|*.wdp|*.wdp';

  SaveFileFilter =
    '画像ファイル|*.png;*.jpg;*.gif;*.bmp;*.tif;*.wdp' +
    '|*.png|*.png' +
    '|*.jpg|*.jpg' +
    '|*.gif|*.gif' +
    '|*.bmp|*.bmp' +
    '|*.tif|*.tif' +
    '|*.wdp|*.wdp';

  ImageHWC   = 440;                           // 表示枠サイズ

var
  OutputBitmap  : TBitmap;                    // 画像処理表示用ビットマップ

//------------------------
// 変倍出力
//------------------------
procedure TForm1.Imageout(Image: TBitmap);
var
  Rect0           : TRect;
  magnification   : Double;
  Check           : Integer;
  MW, MH          : Integer;
begin
  Val(magnificationEdit.Text,magnification,Check);
  if Check <> 0 then begin
    application.MessageBox('表示倍率入力に間違いがあります。','注意',0);
    exit;
  end;
  MW := Round(Image.Width * magnification);
  MH := Round(Image.Height * magnification);
  Rect0 := Rect(0, 0, MW, MH);
  Image1.Width := MW;
  Image1.Height := MH;
  Image1.Picture.Bitmap.SetSize(MW, MH);
  Image1.Canvas.StretchDraw(Rect0, Image);                        // 変倍出力
end;

//----------------------------------------------------
// 開いたファイルの画像表示 出力枠に合わせて変倍出力
//----------------------------------------------------
procedure TForm1.trimming_imageout(Image: TBitmap);
begin
  if Image.Width >= Image.Height then begin
    Image1.Width := ImageHWC - 6;
    image1.Height := round((ImageHWC - 6) * image.Height / Image.Width);
  end
  else begin
    Image1.Height := ImageHWC - 6;
    image1.Width := round((ImageHWC - 6) * image.Width / Image.Height);
  end;
  Image1.Picture.Bitmap.SetSize(Image1.Width, image1.Height);
  Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width, image1.Height), Image);    // 出力枠に変倍出力
  magnificationEdit.Text := floatTostrF(Image1.Width / Image.Width, ffGeneral, 4, 2);
end;

//-------------------
// 表示方法の選択
//-------------------
procedure TForm1.ReDisplayClick(Sender: TObject);
begin
  if RadioButton2.Checked then imageout(OutputBitmap);           // 変倍出力
  if RadioButton1.Checked then trimming_imageout(OutputBitmap);  // 出力枠に合わせて変倍出力
end;

//---------------------
// ファイルのオープン
//---------------------
procedure TForm1.FileOpenBtnClick(Sender: TObject);
var
  VRect       : TRect;                      // 表示サイズ設定用
  WIC         : TWICImage;
begin
  VRect := Rect(0, 0, Image1.Width, Image1.Height);
  Image1.Canvas.Brush.Style := bsSolid;
  Image1.Canvas.Brush.Color := clBtnface;
  Image1.Canvas.FillRect(VRect);                              // Canvas 画像消去
  OpenPictureDialog1.Filter := OpenFileFilter;                // ファイルオープンフィルターの設定
  if OpenPictureDialog1.Execute = true then                   // ファイルが指定されたら
    begin
      WIC := TWICImage.Create;                                // TWICImageの生成
      try
        WIC.LoadFromFile(OpenPictureDialog1.FileName);        // 画像の読み込み
        // OutputBitmapに原画像一時保存
        OutputBitmap.Width  := WIC.Width;
        OutputBitmap.Height := WIC.Height;
        OutputBitmap.Canvas.Draw(0, 0, WIC);                  // ビットマップに描画フォーマット変換書き込み
      finally
        WIC.Free;                                             // TWICImage 解放
      end;
    end
    else exit;
  if RadioButton2.Checked then imageout(OutputBitmap);          // 出力枠に変倍出力
  if RadioButton1.Checked then trimming_imageout(OutputBitmap); // 出力枠に合わせてに変倍出力
  FileSaveBtn.Enabled := True;
end;

//------------------------------
// 画像のファイルへの保存
//------------------------------
procedure TForm1.FileSaveBtnClick(Sender: TObject);
var
  WIC     : TWicImage;
  WICF    : TWicImageFormat;

  Fname   : String;
  ExeStr  : String;
  FnameTop: String;
  Findex  : integer;

  function WFormatSet: Boolean;                                            // 拡張子によるファイルフォーマット設定
  begin
    Result := false;
    ExeStr := LowerCase(ExeStr);
    if ExeStr = '.jpg'  then  begin WICF := Wifjpeg; Result := True; end;
    if ExeStr = '.jpeg' then  begin WICF := Wifjpeg; Result := True; end;
    if ExeStr = '.tif'  then  begin WICF := Wiftiff; Result := True; end;
    if ExeStr = '.tiff' then  begin WICF := Wiftiff; Result := True; end;
    if ExeStr = '.png'  then  begin WICF := Wifpng;  Result := True; end;
    if ExeStr = '.gif'  then  begin WICF := Wifgif;  Result := True; end;
    if ExeStr = '.bmp'  then  begin WICF := Wifbmp;  Result := True; end;
    if ExeStr = '.wdp'  then  begin WICF := WifWMPhoto; Result := True; end;
    if ExeStr = '.hdp'  then  begin WICF := WifWMPhoto; Result := True; end;
  end;

begin
  SavePictureDialog1.Filter := SaveFileFilter;
//  SavePictureDialog1.DefaultExt := GraphicExtension(TWicImage);
  if not SavePictureDialog1.Execute then exit;
  ExeStr := ExtractFileExt(SavePictureDialog1.FileName);
  if ExeStr = '' then begin                                                // 拡張子がなかったら
    Findex := SavePictureDialog1.FilterIndex;                              // FilterIndexによる拡張子の設定
    case Findex of
      1, 3 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.jpg');   // 拡張子の設定
         2 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.png');   // 拡張子の設定
         4 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.gif');   // 拡張子の設定
         5 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.bmp');   // 拡張子の設定
         6 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.tif');   // 拡張子の設定
         7 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.wdp');   // 拡張子の設定
    end;
  end
  else
    Fname := SavePictureDialog1.FileName;
  ExeStr := ExtractFileExt(Fname);                                         // 拡張子だけ取り出し
  if not WFormatSet then begin                                             // 拡張子によるファイルフォーマット設定と確認
    application.MessageBox('ファイルの拡張子が間違っています。','注意', 0);
    exit;
  end;
  FnameTop := ExtractFileName(Fname);                                      // ファイル名だけ取り出し
  if Length(FnameTop) = Length(ExeStr) then begin                          // ファイル名の長さ確認
    application.MessageBox('ファイル名がありません。','注意', 0);
    exit;
  end;

  if FileExists(Fname) then                                                // ファイル名によるファイル検索
    if MessageDlg('既に同じ名前のファイルがあります上書きしますか ' + ExtractFileName(Fname) + '?',
                                                      mtConfirmation, [mbYes, mbNo], 0, mbNo) = IDNo then exit;

  WIC := TWicImage.Create;                                                 // TWicImage生成
  try
    WIC.Assign(OutputBitmap);                                              // TWicImageにビットマップデーター割り付け
    WIC.ImageFormat := WICF;                                               // 保存フォーマットセット
    WIC.SaveTofile(Fname);                                                 // ファイルの書き出し
  finally
    WIC.Free;                                                              // TWicImage解放
  end;
end;

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Width  := ImageHWC div 2;
  Image1.Height := ImageHWC div 2;
  ScrollBox1.Height := ImageHWC;
  ScrollBox1.Width  := ImageHWC;
  Image1.Top := 0;
  Image1.Left := 0;
  OutputBitmap  := TBitmap.Create;
  OutputBitmap.PixelFormat := pf32bit;
  FileSaveBtn.Enabled := False;
end;

// 終了処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
  OutputBitmap.Free;
end;

end.

GDI+ によるファイル変換例

//----------------------------------------------------------------------------
// TBitmapを使用していますが、使用しなくてもファイル変換は可能です。
// 下記を使用すれば変倍描画も可能です。
// Graphics := TGPGraphics.Create(Image1.Canvas.Handle);
// Graphics.DrawImage(GPBitmap, MakeRect(0, 0, Image1.Width, image1.Height));
// TBitmapは画像処理を行うことを前提に使用しています。
//----------------------------------------------------------------------------
unit GdIPFileConvMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.UITypes,
  Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ExtDlgs;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    FileSaveBtn: TButton;
    Panel1: TPanel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    magnificationEdit: TLabeledEdit;
    ReDisplay: TButton;
    FileOpenBtn: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ReDisplayClick(Sender: TObject);
    procedure FileOpenBtnClick(Sender: TObject);
    procedure FileSaveBtnClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
    procedure Imageout(Image: TBitmap);
    procedure trimming_imageout(Image: TBitmap);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
    GDIPAPI, GDIPOBJ, GDIPUTIL;

const
  OpenFileFilter =
    '画像ファイル|*.png;*.jpg;*.gif;*.bmp;*.tif;*.emf;*.wmf;*.ico' +
    '|*.png|*.png' +
    '|*.jpg|*.jpg' +
    '|*.gif|*.gif' +
    '|*.bmp|*.bmp' +
    '|*.tif|*.tif' +
    '|*.emf|*.emf' +
    '|*.wmf|*.wmf' +
    '|*.ico|*.ico';

  SaveFileFilter =
    '画像ファイル|*.png;*.jpg;*.gif;*.bmp;*.tif' +
    '|*.png|*.png' +
    '|*.jpg|*.jpg' +
    '|*.gif|*.gif' +
    '|*.bmp|*.bmp' +
    '|*.tif|*.tif';

  ImageHWC   = 440;                           // 表示枠サイズ

var
  OutputBitmap  : TBitmap;                    // 画像保存用ビットマップ

//------------------------
// 変倍出力
//------------------------
procedure TForm1.Imageout(Image: TBitmap);
var
  Rect0           : TRect;
  magnification   : Double;
  Check           : Integer;
  MW, MH          : Integer;
begin
  Val(magnificationEdit.Text,magnification,Check);
  if Check <> 0 then begin
    application.MessageBox('表示倍率入力に間違いがあります。','注意',0);
    exit;
  end;
  MW := Round(Image.Width * magnification);
  MH := Round(Image.Height * magnification);
  Rect0 := Rect(0, 0, MW, MH);
  Image1.Width := MW;
  Image1.Height := MH;
  Image1.Picture.Bitmap.SetSize(MW, MH);
  Image1.Canvas.StretchDraw(Rect0, Image);                        // 変倍出力
end;

//----------------------------------------------------
// 開いたファイルの画像表示 出力枠に合わせて変倍出力
//----------------------------------------------------
procedure TForm1.trimming_imageout(Image: TBitmap);
begin
  if Image.Width >= Image.Height then begin
    Image1.Width := ImageHWC - 6;
    image1.Height := round((ImageHWC - 6) * image.Height / Image.Width);
  end
  else begin
    Image1.Height := ImageHWC - 6;
    image1.Width := round((ImageHWC - 6) * image.Width / Image.Height);
  end;
  Image1.Picture.Bitmap.SetSize(Image1.Width, image1.Height);
  Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width, image1.Height), Image);    // 出力枠に変倍出力
  magnificationEdit.Text := floatTostrF(Image1.Width / Image.Width, ffGeneral, 4, 2);
end;

//--------------------
// 表示方法の選択
//--------------------
procedure TForm1.ReDisplayClick(Sender: TObject);
begin
  if RadioButton2.Checked then imageout(OutputBitmap);           // 変倍出力
  if RadioButton1.Checked then trimming_imageout(OutputBitmap);  // 出力枠に合わせて変倍出力
end;

//--------------------------------------------------------------
// ファイルを開いてGDI+のbitmapに読み込みます
// GDI+の書き込みハンドルをTbitmapのハンドルに設定
// GDI+のbitmapをTbitmapに書き込みます
// 選択された変倍方法でTbitmapをTimageに書き込み表示します。
// Tbitmap OutputBitmapは元画像データー保存用に使用していますが
// OutputBitmapを省略すことは可能です。
//--------------------------------------------------------------
procedure TForm1.FileOpenBtnClick(Sender: TObject);
var
  Graphics  : TGPGraphics;
  GPBitmap  : TGPBitmap;
  VRect     : TRect;                      // 表示サイズ設定用
begin
  FileSaveBtn.Enabled := False;
  VRect := Rect(0, 0, Image1.Width, Image1.Height);
  Image1.Canvas.Brush.Style := bsSolid;
  Image1.Canvas.Brush.Color := clBtnface;
  Image1.Canvas.FillRect(VRect);                              // Canvas 画像消去
  OpenPictureDialog1.Filter := OpenFileFilter;                // ファイルオープンフィルターの設定
  if OpenPictureDialog1.Execute then                          // ファイルが指定されたら
    begin
      GPBitmap := TGPBitmap.Create(OpenPictureDialog1.FileName);  // ファイルとの関連付け
      OutputBitmap.Height := GPBitmap.GetHeight;
      OutputBitmap.Width  := GPBitmap.GetWidth;
      Graphics := TGPGraphics.Create(OutputBitmap.Canvas.Handle);
      try
        Graphics.DrawImage(GPBitmap, 0, 0, OutputBitmap.Width, OutputBitmap.Height);
      finally
        Graphics.Free;
        GPBitmap.Free;
      end;
    end
    else exit;
  if RadioButton2.Checked then imageout(OutputBitmap);          // 出力枠に変倍出力
  if RadioButton1.Checked then trimming_imageout(OutputBitmap); // 出力枠に合わせてに変倍出力
  FileSaveBtn.Enabled := True;
end;

//----------------------------------------------------------------
// ファイルの名前と種類を選択して保存します。
// TbitmapのデーターをGDI+に渡すためにTMemoryStreamを使用します。
//----------------------------------------------------------------
procedure TForm1.FileSaveBtnClick(Sender: TObject);
var
  GPBitmap  : TGPBitmap;
  Astream   : TMemoryStream;
  Fname     : String;                                           // 保存用ファイル名
  ExeStr    : String;
  FnameTop  : String;
  Convstr   : String;
  Findex    : integer;
  LImgGUID  : TGUID;

  function GdipFormatSet: boolean;
  begin
    Result := false;
    ExeStr := LowerCase(ExeStr);
    if ExeStr = '.png'   then begin Convstr := 'image/png';  Result := true; end;
    if ExeStr = '.jpg'   then begin Convstr := 'image/jpeg'; Result := true; end;
    if ExeStr = '.jpeg'  then begin Convstr := 'image/jpeg'; Result := true; end;
    if ExeStr = '.gif'   then begin Convstr := 'image/gif';  Result := true; end;
    if ExeStr = '.bmp'   then begin Convstr := 'image/bmp';  Result := true; end;
    if ExeStr = '.tif'   then begin Convstr := 'image/tiff'; Result := true; end;
    if ExeStr = '.tiff'  then begin Convstr := 'image/tiff'; Result := true; end;
  end;

begin
  SavePictureDialog1.Filter := SaveFileFilter;
  if not SavePictureDialog1.Execute then exit;
  ExeStr := ExtractFileExt(SavePictureDialog1.FileName);                  // 拡張子の取り出し
  if ExeStr = '' then begin                                               // 拡張子がなかったら
    Findex := SavePictureDialog1.FilterIndex;                             // FilterIndexによる拡張子の設定
    case Findex of
      2 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.png');     // 拡張子の設定
      3 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.jpg');
      4 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.gif');
      5 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.bmp');
      6 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.tif');
    end;
  end
  else
    Fname := SavePictureDialog1.FileName;
  ExeStr := ExtractFileExt(Fname);                                        // 拡張子だけ取り出し
  if not GdipFormatSet then begin                                             // 拡張子によるファイルフォーマット設定と確認
    application.MessageBox('ファイルの拡張子が間違っています。','注意', 0);
    exit;
  end;
  FnameTop := ExtractFileName(Fname);                                     // ファイル名だけ取り出し
  if Length(FnameTop) = Length(ExeStr) then begin                         // ファイル名の長さ確認
    application.MessageBox('ファイル名がありません。','注意', 0);
    exit;
  end;

  if FileExists(Fname) then                                               // ファイル名によるファイル検索
    if MessageDlg('既に同じ名前のファイルがあります上書きしますか ' + ExtractFileName(Fname) + '?',
                                                      mtConfirmation, [mbYes, mbNo], 0, mbNo) = IDNo then exit;
  // メモリーストリームを作成し OutputBitmap を出力
  Astream  := TMemoryStream.Create;
  OutputBitmap.SaveToStream(Astream);
  // メモリーストリームから,TGPBitmapのオブジェクトに読み込み指定
  GPBitmap := TGPBitmap.Create(TStreamAdapter.Create(AStream, soReference));
  try
    // ファイル形式指定して書き込み
    if GetEncoderClsid(Convstr, LImgGUID) >= 0 then GPBitmap.Save(Fname, LImgGUID);
  finally
    // メモリー解放
    GPBitmap.Free;
    Astream.Free;
  end;
end;

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Width  := ImageHWC div 2;
  Image1.Height := ImageHWC div 2;
  ScrollBox1.Height := ImageHWC;
  ScrollBox1.Width  := ImageHWC;
  Image1.Top := 0;
  Image1.Left := 0;
  OutputBitmap  := TBitmap.Create;
  OutputBitmap.PixelFormat := pf32bit;
  FileSaveBtn.Enabled := False;
end;

// 終了処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
  OutputBitmap.Free;
end;

end.

Timage, ユニットJPEG,GifImg,PngImage によるファイル変換

//----------------------------------------------------
// Tiffファイルの読み込みはWIC経由になります。
// Tiff形式ファイルの出力はプロクラムされていません。
//----------------------------------------------------
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtDlgs, Vcl.StdCtrls, Vcl.ExtCtrls, System.UITypes;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Image1: TImage;
    FileSaveBtn: TButton;
    FileOpenBtn: TButton;
    Panel1: TPanel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    magnificationEdit: TLabeledEdit;
    ReDisplay: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    procedure FormCreate(Sender: TObject);
    procedure ReDisplayClick(Sender: TObject);
    procedure FileOpenBtnClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FileSaveBtnClick(Sender: TObject);
  private
    { Private 宣言 }
    procedure Imageout(Image: TBitmap);
    procedure AutoSize_imageout(Image: TBitmap);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Jpeg, GifImg, PNGImage;

const

  OpenFileFilter =
    'bmp|*.bmp' +
    '|wmf|*.wmf' +
    '|emf|*.emf' +
    '|ico|*.ico' +
    '|tif|*.tif;*tiff' +
    '|png|*.png' +
    '|jpg|*.jpg;*.jpeg' +
    '|gif|*.gif';

  SaveFileFilter =
    'bmp|*.bmp' +
    '|png|*.png' +
    '|jpg|*.jpg' +
    '|gif|*.gif';

   ImageHWC   = 440;                            // 表示枠サイズ
var
  InputImage    : TImage;                       // 画像入力用
  OutBitmap     : Tbitmap;                      // 画像用ビットマップ
  Findex        : integer;                      // ファイルインデックス

//------------------------
// 変倍出力
//------------------------
procedure TForm1.Imageout(Image: TBitmap);
var
  Rect0           : TRect;
  magnification   : Double;
  Check           : Integer;
  MW, MH          : Integer;
begin
  Val(magnificationEdit.Text,magnification,Check);
  if Check <> 0 then begin
    application.MessageBox('表示倍率入力に間違いがあります。','注意',0);
    exit;
  end;
  MW := Round(Image.Width * magnification);
  MH := Round(Image.Height * magnification);
  Rect0 := Rect(0, 0, MW, MH);
  Image1.Width := MW;
  Image1.Height := MH;
  Image1.Picture.Bitmap.SetSize(MW, MH);
  Image1.Canvas.StretchDraw(Rect0, Image);                        // 変倍出力
end;

//----------------------------------------------------
// 開いたファイルの画像表示 出力枠に合わせて変倍出力
//----------------------------------------------------
procedure TForm1.AutoSize_imageout(Image: TBitmap);
begin
  if Image.Width >= Image.Height then begin
    Image1.Width := ImageHWC - 6;
    image1.Height := round((ImageHWC - 6) * image.Height / Image.Width);
  end
  else begin
    Image1.Height := ImageHWC - 6;
    image1.Width := round((ImageHWC - 6) * image.Width / Image.Height);
  end;
  Image1.Picture.Bitmap.SetSize(Image1.Width, image1.Height);
  Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width, image1.Height), Image);    // 出力枠に変倍出力
  magnificationEdit.Text := floatTostrF(Image1.Width / Image.Width, ffGeneral, 4, 2);
end;

//-------------------
// 表示方法の選択
//-------------------
procedure TForm1.ReDisplayClick(Sender: TObject);
begin
  if RadioButton2.Checked then imageout(OutBitmap);           // 変倍出力
  if RadioButton1.Checked then AutoSize_imageout(OutBitmap);  // 出力枠に合わせて変倍出力
end;

//----------------------------------------------------------------------------
// 画像ファイルの読み込み
// Tiff形式のファイルはWIC経由となります。
// メタ形式のファイル wmf と emf は 表示のみです。
// メタ形式のファイル以外ビットマップ形式に変換後表示しています。
// 画像ファイルをTImage に読み込んでから TBitmapに変換しています。
// TBitmapはビットマップファイルしか読み込めないのでTImageを経由させています。
//----------------------------------------------------------------------------
procedure TForm1.FileOpenBtnClick(Sender: TObject);
var
  VRect : TRect;
  IPng  : TPNGImage;
  IJpeg : TJPEGImage;
  IGif  : TGIFImage;
  exstr : string;
begin
  VRect := Rect(0, 0, Image1.Width, Image1.Height);
  // 表示画像の消去
  case Findex of
    1,4,5,
    6,7,8 : begin
              Image1.Canvas.Brush.Style := bsSolid;
              Image1.Canvas.Brush.Color := clBtnface;
              Image1.Canvas.FillRect(VRect);                  // Canvas 画像消去
            end;
    2,3:    begin
              Image1.Picture.Assign(nil);                     // Pictureの解除 画面消去
            end;
  end;
  OpenPictureDialog1.Filter := OpenFileFilter;                // ファイルオープンフィルターの設定
  OpenPictureDialog1.FileName := '';
  if OpenPictureDialog1.Execute = true then                   // ファイルが指定されたら
    begin
      FileSaveBtn.Enabled := False;
//      Findex := OpenPictureDialog1.FilterIndex;
      exstr := ExtractFileExt(OpenPictureDialog1.FileName);   // 拡張子の取り出し
      exstr := LowerCase(exstr);                              // 小文字変換
      Findex := 0;
      if (exstr = '.bmp') or (exstr = '.ico') or (exstr = '.tif') then Findex := 1;
      if (exstr = '.wmf') or (exstr = '.emf')                     then Findex := 2;
      if (exstr = '.png')                                         then Findex := 6;
      if (exstr = '.jpg') or (exstr = '.jpeg')                    then Findex := 7;
      if (exstr = '.gif')                                         then Findex := 8;
      Image1.AutoSize := False;
      Image1.Width  := ImageHWC div 2;
      Image1.Height := ImageHWC div 2;
      case Findex of
        1,4,5:  begin
                  InputImage.Picture.LoadFromFile(OpenPictureDialog1.FileName);    // BITMAP画像の読み込み
                end;
        2,3:    begin
                  Image1.AutoSize := True;
                  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);        // メタ画像表示のみ
                  exit;
                end;
        6:      begin
                  IPng := TPNGImage.Create;
                  IPng.LoadFromFile(OpenPictureDialog1.FileName);                  // PNG画像の読み込み
                  InputImage.Picture.Assign(IPng);
                  IPng.Free;
                end;
        7:      begin
                  IJpeg := TJPEGImage.Create;
                  IJpeg.LoadFromFile(OpenPictureDialog1.FileName);                 // JPEG画像の読み込み
                  InputImage.Picture.Assign(IJpeg);
                  IJpeg.Free;
                end;
        8:      begin
                  IGif := TGIFImage.Create;
                  IGif.LoadFromFile(OpenPictureDialog1.FileName);                  // GIF画像の読み込み
                  InputImage.Picture.Assign(IGif);
                  IGif.Free;
                end
        else exit;                                           // 指定外の拡張子なら終了
      end;
    end
    else exit;                                               // ファイルの指定が無ければ終了
  OutBitmap.Assign(nil);                                     // ビットマップの解除
  OutBitmap.Assign(InputImage.Picture.Graphic);              // ビットマップに関連付け
  if RadioButton2.Checked then imageout(OutBitmap);          // 出力枠に変倍出力
  if RadioButton1.Checked then AutoSize_imageout(OutBitmap); // 出力枠に合わせてに変倍出力
  FileSaveBtn.Enabled := True;
end;

//------------------------------------------------------------------
// メタ形式のファイル wmf と emf は 保存できません。
// Tiff 形式は WIC を使用したプログラムを参照してください。
//------------------------------------------------------------------
procedure TForm1.FileSaveBtnClick(Sender: TObject);
var
  IPng  : TPNGImage;
  IJpeg : TJPEGImage;
  IGif  : TGIFImage;
  exstr : string;
  Fname : string;
  FnameTop : string;
  Fint  : integer;
begin
  SavePictureDialog1.Filter := SaveFileFilter;
  if not SavePictureDialog1.Execute then exit;
  exstr := ExtractFileExt(SavePictureDialog1.FileName);                 // 拡張子の取り出し
  if exstr = '' then begin                                              // 拡張子がなかったら
    case SavePictureDialog1.FilterIndex of
      1 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.bmp');   // 拡張子の設定
      2 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.png');
      3 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.jpg');
      4 : Fname := ChangeFileExt(SavePictureDialog1.FileName,'.gif');
    end;
  end
  else
    Fname := SavePictureDialog1.FileName;

  exstr := ExtractFileExt(Fname);                                       // 拡張子の取り出し
  FnameTop := ExtractFileName(Fname);                                   // ファイル名だけ取り出し
  if Length(FnameTop) = Length(exstr) then begin                        // ファイル名の長さ確認
    application.MessageBox('ファイル名がありません。','注意', 0);
    exit;
  end;
  if FileExists(Fname) then                                             // ファイル名によるファイル検索
    if MessageDlg('既に同じ名前のファイルがあります上書きしますか ' + ExtractFileName(Fname) + '?',
                                                      mtConfirmation, [mbYes, mbNo], 0, mbNo) = IDNo then exit;
  exstr := LowerCase(exstr);                                            // 小文字変換
  Fint := 0;
  if (exstr = '.bmp')                       then Fint := 1;
  if (exstr = '.png')                       then Fint := 6;
  if (exstr = '.jpg') or (exstr = '.jpeg')  then Fint := 7;
  if (exstr = '.gif')                       then Fint := 8;
  case Fint of
    1:  begin
          OutBitmap.SaveToFile(Fname);
        end;
    6:  begin
          IPng := TPNGImage.Create;
          IPng.Assign(OutBitmap);
          IPng.SaveToFile(Fname);
          IPng.Free;
        end;
    7:  begin
          IJpeg := TJPEGImage.Create;
          IJpeg.Assign(OutBitmap);
          IJpeg.SaveToFile(Fname);
          IJpeg.Free;
        end;
    8:  begin
          IGif := TGifImage.Create;
          IGif.Assign(OutBitmap);
          IGif.SaveToFile(Fname);
          IGif.Free;
        end;
  end;
end;

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Width  := ImageHWC div 2;
  Image1.Height := ImageHWC div 2;
  ScrollBox1.Height := ImageHWC;
  ScrollBox1.Width  := ImageHWC;
  Image1.Top := 0;
  Image1.Left := 0;
  InputImage  := Timage.Create(nil);
  InputImage.AutoSize := true;
  OutBitmap := Tbitmap.Create;
  FileSaveBtn.Enabled := False;
  Findex := 0;
end;

// 終了処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
  InputImage.Free;
  OutBitmap.Free;
end;

end.

FMXによるファイル変換

//--------------------------------------------------------
// Delphi XE7 でのプログラムです。
// OpenDialog、SaveDialog1でFilterのindexが取得できない為
// ラジオボタンで保存ファイル形式を選択しています。
//--------------------------------------------------------
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Ani, FMX.Layouts, FMX.Gestures, FMX.StdCtrls,
  FMX.ExtCtrls;

type
  TForm1 = class(TForm)
    ToolbarHolder: TLayout;
    ToolbarPopup: TPopup;
    ToolbarPopupAnimation: TFloatAnimation;
    ToolBar1: TToolBar;
    ToolbarApplyButton: TButton;
    ToolbarCloseButton: TButton;
    ToolbarAddButton: TButton;
    Button1: TButton;
    ImageViewer1: TImageViewer;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Panel1: TPanel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    Button2: TButton;
    procedure ToolbarCloseButtonClick(Sender: TObject);
    procedure FormGesture(Sender: TObject;
      const EventInfo: TGestureEventInfo; var Handled: Boolean);
    procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
      Shift: TShiftState);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FGestureOrigin: TPointF;
    FGestureInProgress: Boolean;
    { private 宣言 }
    procedure ShowToolbar(AShow: Boolean);
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin
  if Key = vkEscape then
    ShowToolbar(not ToolbarPopup.IsOpen);
end;

procedure TForm1.ToolbarCloseButtonClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    ImageViewer1.Bitmap.LoadFromFile(OpenDialog1.FileName);
    Button2.Enabled := True;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Fname     : string;
begin
  SaveDialog1.FilterIndex := 1;
  if RadioButton1.IsChecked then SaveDialog1.Filter := 'ビットマップ|*bmp';
  if RadioButton2.IsChecked then SaveDialog1.Filter := 'ジェイペグ|*.jpg;*.jpeg';
  if RadioButton3.IsChecked then SaveDialog1.Filter := 'ピング|*.png';
  if RadioButton4.IsChecked then SaveDialog1.Filter := 'ティフ|*.tif;*.tiff';
  if RadioButton5.IsChecked then SaveDialog1.Filter := 'ギフ|*.gif';
  if SaveDialog1.Execute then begin
    Fname := SaveDialog1.FileName;
  end
  else Exit;
  if RadioButton1.IsChecked then Fname := ChangeFileExt(SaveDialog1.FileName,'.bmp');     // 拡張子の設定
  if RadioButton2.IsChecked then Fname := ChangeFileExt(SaveDialog1.FileName,'.jpg');
  if RadioButton3.IsChecked then Fname := ChangeFileExt(SaveDialog1.FileName,'.png');
  if RadioButton4.IsChecked then Fname := ChangeFileExt(SaveDialog1.FileName,'.tif');
  if RadioButton5.IsChecked then Fname := ChangeFileExt(SaveDialog1.FileName,'.gif');
  ImageViewer1.Bitmap.SaveToFile(Fname, nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button2.Enabled := False;
end;

procedure TForm1.FormGesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  DX, DY : Single;
begin
  if EventInfo.GestureID = igiPan then
  begin
    if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags)
      and ((Sender = ToolbarPopup)
        or (EventInfo.Location.Y > (ClientHeight - 70))) then
    begin
      FGestureOrigin := EventInfo.Location;
      FGestureInProgress := True;
    end;

    if FGestureInProgress and (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
    begin
      FGestureInProgress := False;
      DX := EventInfo.Location.X - FGestureOrigin.X;
      DY := EventInfo.Location.Y - FGestureOrigin.Y;
      if (Abs(DY) > Abs(DX)) then
        ShowToolbar(DY < 0);
    end;
  end;
end;

procedure TForm1.ShowToolbar(AShow: Boolean);
begin
  ToolbarPopup.Width := ClientWidth;
  ToolbarPopup.PlacementRectangle.Rect := TRectF.Create(0, ClientHeight-ToolbarPopup.Height, ClientWidth-1, ClientHeight-1);
  ToolbarPopupAnimation.StartValue := ToolbarPopup.Height;
  ToolbarPopupAnimation.StopValue := 0;

  ToolbarPopup.IsOpen := AShow;
end;

end.

    download FileConvert.zip

画像処理一覧へ戻る

      最初に戻る