PaintBoxからJPEG若しくはBitMapへ

解決


yTake  2015-05-03 21:29:23  No: 47265

続けて失礼します。

PaintBoxの描画内容をJPEGファイルに保存したいと思います。

元々、別のプロシージャ内でBitMapへ描画してからPaintBoxへStretchDrawしたのですが、ここのBitMapはローカル変数としていたので、既にありません。
このBitMapをグローバルで定義し直せば済むと思いますが、グローバル変数の多用は芸がないと思いました。画像そのものはPaintBoxに描画されていますので、それをBitMapへ戻すか、JPEGへ渡せれば、OKなのですが、うまくゆきません。

PaintBoxからBitMapへ逆にStretchDrawしようと思いましたが、引数の型が合いません。BitMap.CanvasへPaintBox.Canvasや、JPEGでPaintBoxを直接Assignしましたが、エラーになります。(当然ですが、コンバージョンエラー)

PaintBoxをbitmapやJPEGへコピーなどする事はできないでしょうか?
できなければ、グローバルのBitMapを用いる事にしたいと思います。

環境:
Windows7(32 bit)+  DELPHI XE3

よろしくお願いします。


igy  2015-05-03 22:03:20  No: 47266

>元々、別のプロシージャ内でBitMapへ描画してからPaintBoxへStretchDrawしたのですが

これは、PaintboxのOnPaintイベントで行っていますか?


yTake  2015-05-03 23:58:11  No: 47267

igyさん
ありがとうございます。

いいえ。
ボタンを配置して、ボタンのonClickで行なっています。

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp  :  TBitMap;
  dst  :  TRect;
begin
  bmp  := TBitMap.Create();
  bmp.PixelFormat  := pf24bit;
//  bmpへの描画
//  dstの範囲をPaintBoxのサイズに設定
  PaintBox.Canvas.StretchDraw( dst, bmp );
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  JPeg  : TJPEGIMage;
  bmp   : TBitMap;
  fname : String;
begin
  JPeg  : TJPEGImage.Create();
  
//  PaintBoxをbmpへ

  JPeg.Assign( bmp );
  JPeg.SaveToFile( fname );
end;

などの様に考えています。


igy  2015-05-04 00:26:21  No: 47268

>ボタンを配置して、ボタンのonClickで行なっています。

これだと、Button1Clickで描画後、

別のプログラム(メモ帳とか)を起動して、PaintBoxがある箇所に移動したり、
あるいは、そのプログラム自体を最小化し、元に戻したりして、

再描画を発生させるとPaintBoxの内容は、表示されないのでは?


yTake  2015-05-04 01:30:55  No: 47269

>再描画を発生させるとPaintBoxの内容は、表示されないのでは?
確かに。

実は、Imageコンポーネントにも同様のBitMap内容を描画しています。
こちらは、再描画させても内容は表示されています。

そう言えば、PaitBoxはonPaintの中で描画していないと再描画されないとの注意があった様な、、、

すみません。この辺、先に修正してみます。


yTake  2015-05-04 02:03:10  No: 47270

修正しましたが、結局、OnPaintで再描画する必要性からbitmapをグローバルとしするのが良いと思われました。

procedure TForm1.PaintBoxPaint(Sender: TObject);
var
    dst  : TRect;
begin
    dst.Left    :=  0;
    dst.Top     :=  0;
    dst.Right   :=  PaintBox.Width;
    dst.Bottom  :=  PaintBox.Height;
    PaintBox.Canvas.StretchDraw( dst, bmp_c );
end;

ここで、bmp_cはグローバルです。

Imageコンポーネントでは再描画してくれますが、BitMapやJPEGでファイルへ保存する事を考えると、BitMapを維持した方が良いと思いました。

このbmp_cを用いて、JPEGImage.Assign, JPEGImage.SaveToFileで保存できました。

PaintBoxの特性など、以前過去のQ&Aを参照させて頂きましたが、生かされていませんでした。

igyさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加