続けて失礼します。
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
よろしくお願いします。
>元々、別のプロシージャ内でBitMapへ描画してからPaintBoxへStretchDrawしたのですが
これは、PaintboxのOnPaintイベントで行っていますか?
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;
などの様に考えています。
>ボタンを配置して、ボタンのonClickで行なっています。
これだと、Button1Clickで描画後、
別のプログラム(メモ帳とか)を起動して、PaintBoxがある箇所に移動したり、
あるいは、そのプログラム自体を最小化し、元に戻したりして、
再描画を発生させるとPaintBoxの内容は、表示されないのでは?
>再描画を発生させるとPaintBoxの内容は、表示されないのでは?
確かに。
実は、Imageコンポーネントにも同様のBitMap内容を描画しています。
こちらは、再描画させても内容は表示されています。
そう言えば、PaitBoxはonPaintの中で描画していないと再描画されないとの注意があった様な、、、
すみません。この辺、先に修正してみます。
修正しましたが、結局、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さん、ありがとうございました。
ツイート | ![]() |