AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] 画像を開き、編集、保存する 2014/06/05
 
前回は、変換マトリックス(Matrix)について記述しました。これでおおよそ、キャンバス内のプロパティ・メソッドについては見終わりました。あと Bitmap プロパティというものがありますが、PaintBox コンポーネントのキャンバスでは関係無さそうで、PaintBox コンポーネントの MakeScreenShot メソッドも無効化されているようですので、Image コンポーネントのキャンバスで見ていきます。
 
[Standard]内のボタン(Button)、及び、[Shapes]内の画像(Image)を配置し、Image1 の ClipChildernプロパティを True にしておきます。uses節に「System.UIConsts」を追記します。

ボタン Button1 をダブルクリックして、Button1 の OnClick イベントハンドラを下記のようにしてみます。
procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 with Image1.Canvas do begin
  BeginScene ;
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  for i := 1 to 1000 do begin
   Stroke.Color := $FF000000 + Cardinal(Random(256*256*256)) ;
   DrawLine(PointF(75,75),PointF(Random(150),Random(150)),1.0);
  end;
  EndScene ;
 end;
end;
保存・ビルド(コンパイル)・実行をしてボタンをクリックすると下図の画面が表示されます。

思ったように表示されました。が、この作成した絵は、あくまでも Image1 の表面上に描いただけのもので、Image1 の中身に描いたものではないため、この状態では、スクリーンショットを取る事も、この絵を保存する事も、出来ません。
 
スクリーンショットを取ったり、保存したりするためには、Image1 の中身=Bitmap プロパティ内を編集する必要があります。ですので
procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 with Image1.Bitmap.Canvas do begin
  BeginScene ;
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  for i := 1 to 1000 do begin
   Stroke.Color := $FF000000 + Cardinal(Random(256*256*256)) ;
   DrawLine(PointF(75,75),PointF(Random(150),Random(150)),1.0);
  end;
  EndScene ;
 end;
end;
のようにします。保存・ビルド(コンパイル)・実行をすると、エラーが出ます。なぜなら、Bitmap オブジェクトが何の準備も出来ていないのに、いきなり作業に入ってしまったからです。まずは、Bitmap オブジェクトを生成しないといけません。
 
procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 Image1.Bitmap := TBitmap.Create(
           Round(Image1.Width),Round(Image1.Height));
 with Image1.Bitmap.Canvas do begin
  BeginScene ;
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  for i := 1 to 1000 do begin
   Stroke.Color := $FF000000 + Cardinal(Random(256*256*256)) ;
   DrawLine(PointF(75,75),PointF(Random(150),Random(150)),1.0);
  end;
  EndScene ;
 end;
end;
として、保存・ビルド(コンパイル)・実行すれば、エラーせず、上記と同じ画面を表示する事が出来、スクリーンショットを取ったり、保存したりする事が出来ます。
Image1.Bitmap := TBitmap.Create(
          Round(Image1.Width),Round(Image1.Height));
という箇所は、
Image1.Bitmap.Create(Round(Image1.Width),Round(Image1.Height));
と記述しても大丈夫です。
 
試しに、スクリーンショットを取って確認してみます。[Shapes]内の画像(Image)をもう1つ配置し、下記のように追記してみます。

procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 Image1.Bitmap := TBitmap.Create(
           Round(Image1.Width),Round(Image1.Height));
 with Image1.Bitmap.Canvas do begin
  BeginScene ;
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  for i := 1 to 1000 do begin
   Stroke.Color := $FF000000 + Cardinal(Random(256*256*256)) ;
   DrawLine(PointF(75,75),PointF(Random(150),Random(150)),1.0);
  end;
  EndScene ;
 end;
 Image2.Bitmap := Image1.MakeScreenshot ;
end;
保存・ビルド(コンパイル)・実行をして、ボタンをクリックすると下図のように表示されます。

 
スクリーンショットではなく、描画した図を画像ファイルとして保存してみます。
procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 Image1.Bitmap := TBitmap.Create(
           Round(Image1.Width),Round(Image1.Height));
 with Image1.Bitmap.Canvas do begin
  BeginScene ;
  Clear(claWhite);
  Stroke.Kind := TBrushKind.bkSolid ;
  for i := 1 to 1000 do begin
   Stroke.Color := $FF000000 + Cardinal(Random(256*256*256)) ;
   DrawLine(PointF(75,75),PointF(Random(150),Random(150)),1.0);
  end;
  EndScene ;
 end;
 // Image2.Bitmap := Image1.MakeScreenshot ;
 Image1.Bitmap.SaveToFile('Test.bmp');
end;
保存・ビルド(コンパイル)・実行をして、ボタンをクリックすると、描画した図を画像ファイル「Test.bmp」として保存します。画像ファイルの場所(フォルダ)は何も指定していないので、実行プログラムと同じ場所になりますが、通常は、ちゃんとフォルダを指定したほうがいいと思います。

 
画像のファイル形式は、ヘルプによれば、
サポートされている画像形式すべてのプラットフォームでサポートされている画像形式は以下のとおりです。
・JPEG(.jpeg、.jpg)
・TIFF(.tiff、.tif)
・GIF
・PNG
・BMP
Windows での Direct2D に関係する追加形式は以下のとおりです。
・JPEG XR(.hdp、.jxr、.wdp)
・ICO
Windows での GDI+ に関係する追加形式は以下のとおりです。
・WMF
・ICO
OS X での追加形式は以下のとおりです。
・JPEG 2000(.jp2)
・PSD
・TGA
・ICNS
とあります。
 
 
上記は、白紙状態で図を描画していましたが、次は、画像を開けるようにしてみます。
 
[Dialogs]内の「開く」画面(OpenDialog)を配置します。

開く画面 OpenDialog1 の Options.ofFileMustExist は True にしておきます。存在しないファイル名を入力されると問題ですので。

 
ボタン Button1 のOnClickイベントハンドラを下記のように記述します。
procedure TForm1.Button1Click(Sender: TObject);
var
 fn : string ;
 i, x, y : integer ;
begin
 if (OpenDialog1.Execute) then begin
  fn := OpenDialog1.FileName ;
  Image1.Bitmap.LoadFromFile(fn);
  x := Image1.Bitmap.Width ;
  y := Image1.Bitmap.Height ;
  // Image1.Bitmap := TBitmap.Create(
           Round(Image1.Width),Round(Image1.Height));
  with Image1.Bitmap.Canvas do begin
   BeginScene ;
   // Clear(claWhite);
   Stroke.Kind := TBrushKind.bkSolid ;
   for i := 1 to 1000 do begin
    Stroke.Color := $FF000000 + Cardinal(Random(256*256*256));
    DrawLine(PointF(x/2,y/2),PointF(Random(x),Random(y)),1.0);
   end;
   EndScene ;
  end;
  // Image2.Bitmap := Image1.MakeScreenshot ;
  fn := ExtractFilePath(ParamStr(0))+'Test.bmp';
  Image1.Bitmap.SaveToFile(fn);
 end;
end;
実際のプログラミングの際にはちゃんと例外処理を入れるべきですし、細かい指定等も入れるのが普通ですが、テストということで除外します。Clearメソッドは、せっかく開いた画像を消してしまうのでコメント化します。描画する線は画面中央から画面一杯に描くよう修正します。最後の保存は、実行プログラムと同じ場所に行うよう修正します。
 
保存・ビルド(コンパイル)・実行をして、ボタンをクリックすると、「OpenDialog1.Execute」により、「開く」画面が表示されます。ここでは恒例のように「アジサイ.jpg」を指定しています。

 
ファイルを指定し「開く」をクリック(又はファイルをダブルクリック)すると、下図のように表示されます。

 
Windowsのエクスプローラで、ファイルが保存されたかどうかを確認します。

 
ちゃんと画像ファイルが保存されている事が分かります。
 
保存する場所を指定したい場合には、[Doalogs]内の
「保存」画面(SaveDialog)を利用して、それに応じたプログラミングを行うようにすれば良いです。
 
 
テストとして BMP形式で保存させましたが、保存するファイル名の拡張子を変えるだけで、JPEG形式や GIF形式などで保存する事が出来ます。従来のVCLアプリケーションであれば、JPEGユニット等を uses節に追加したり、各形式用の必要コードを記述する必要があったりしますが、それと比較すればかなり気軽で簡単に行う事が出来る、という事が分かります。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/06/03
 2014/06/05
▼2014/06/06
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.