2つのimageを合成して1つのfileに保存するには?

解決


aglycon  2005-10-28 22:49:14  No: 18318

formにimage1とimage2を縦に並べて配置し、TBitMapを介さずcanvasに直接、image1にはX軸目盛りを、image2には横棒グラフを描画しています。(image2がscrollしてもX軸目盛りを消さない目的です)

全体として、X軸目盛りの付いた横棒グラフが表示されます。
この全体を1つのfileに保存したいのですが、
pictureのSaveToFileメソッドではまとめて保存できません。

どうすればいいのですか?


えーと  2005-10-29 01:49:20  No: 18319

SaveToStream でおのおのメモリストリームに写し、さらにもうひとつメモリストリーム
に二つのサイズとともに書きうつしてひとつにした後、SaveToFile でひとつのファイル
にします。


私なら  2005-10-29 02:00:25  No: 18320

TBitmap を作成し、これに image1.picture.bitmap と image2.picture.bitmap を Bitblt し、その後 TBitmap をファイルに保存します。


えーと  2005-10-29 02:05:16  No: 18321

> image2がscrollしてもX軸目盛りを消さない目的

ひとつのイメージにしたら意味無いんじゃ・・・


おっ  2005-10-29 02:33:16  No: 18322

ちなみに、保存したファイルはどう扱いたいかにもよるのでは?

再利用(?)で、ペイント等のお絵かきソフトで見たい場合、私なら さんのように、
1つのビットマップとして作成する必要がありますね。
ですが、アプリが使うだけの保存であれば、えーと さんの回答のように、FileStreamで、単純に連結したファイルをつくるのもありかもしれません。


あらら  2005-10-29 02:52:09  No: 18323

> image2がscrollしてもX軸目盛りを消さない目的

どうやってひとつにできますか? 相対的な位置が決められないから二つの画像に
しているんでしょよね?


aglycon  2005-10-29 04:30:04  No: 18324

質問が不明瞭な点をお詫びいたします。おっ 様のご指摘によって明瞭になりましたことに感謝致します。
再利用目的は、ペイント等で見るためですので、1つのイメージにして保存したいのです。
向かうべき方向は私なら様に示して頂きましたので、解決にします。
皆様ありがとうございました。


Mr.XRAY  URL  2005-10-29 05:02:32  No: 18325

>この全体を1つのfileに保存したいのですが、

2つのTImageを別々として一つのファイルに保存する例です.
趣旨にかなうかは不明です.
Button1Click,Button2Clickと,Button3Click,Button4Clickはペアです.
以下の例では,同じForm上に読出しています.いろいろ工夫して下さい.

Imageまるごと保存しておけば,(TImageを配置していない)他のForm上
でも読出せます.

//=====================================================================
//  保存先のパス名
//  AFilePathはグローバル変数(private部等で定義しておく)
//=====================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
     AFilePath:=ExtractFilePath(Application.ExeName)+'Images.dat';
end;
//=====================================================================
//  Imageごと保存する例
//=====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     AStream : TFileStream;
begin
     AStream:=TFileStream.Create(AFilePath,fmCreate or fmOpenReadWrite);
     try
       AStream.WriteComponent(Image1);
       AStream.WriteComponent(Image2);
     finally
       AStream.Free;
     end;
end;
//=====================================================================
//  Button1ClickでImageごと保存したImageを取出して表示  
//=====================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
     AStream : TFileStream;
begin
     if not FileExists(AFilePath) then exit;
     //元通りに読出されることを確認するために位置を変更しておく
     Image1.Left:=10;
     Image2.Left:=10;
     Update;
     Sleep(2000);
     AStream:=TFileStream.Create(AFilePath,fmOpenRead);
     AStream.Position:=0;
     try
       if AStream.Size>0 then begin
         AStream.ReadComponent(Image1);
         AStream.ReadComponent(Image2);
       end;
     finally
       AStream.Free;
     end;
end;
//=====================================================================
//  Pictureだけを保存する
//=====================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
     AStream : TFileStream;
begin
     AStream:=TFileStream.Create(AFilePath,fmCreate or fmOpenReadWrite);
     try
       Image1.Picture.Graphic.SaveToStream(AStream);
       Image2.Picture.Graphic.SaveToStream(AStream);
     finally
       AStream.Free;
     end;
end;
//=====================================================================
//  Button3Clickで保存したPictureのBitmapを読出す
//  Pictureそのものは不可.TPicture.LoadFromStreamが無いのはストリーム
//  だけではどんなグラフィックスフォーマットか簡単に判断できないため
//=====================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
     AStream  : TFileStream;
     APicture : TPicture;
begin
     if not FileExists(AFilePath) then exit;
     //読込まれる事を確認するために画像を一旦消去
     //Image1.Picture:=nilも同じ
     Image1.Picture.Bitmap:=nil;
     Image2.Picture.Bitmap:=nil;
     Update;
     Sleep(2000);

     AStream:=TFileStream.Create(AFilePath,fmOpenRead);
     AStream.Position:=0;
     APicture :=TPicture.Create;
     try
       if AStream.Size>0 then begin
         Image1.Picture.Bitmap.LoadFromStream(AStream);
         Image2.Picture.Bitmap.LoadFromStream(AStream);
       end;
     finally
       AStream.Free;
       APicture.Free;
     end;
end;

end.


Mr.XRAY  URL  2005-10-29 05:07:12  No: 18326

>(TImageを配置していない)他のForm上でも読出せます.

ウソです.ImageをCreateする必要があります.


Mr.XRAY  2005-10-29 05:23:10  No: 18327

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_SaveComponentList2.htm

こんなところも参考になるかも知れません.
ただし,上のURLのコードではSave.... LoadがTFormのメソッドになっています.
TImageDataListのメソッドにした方が使いやすいのではないかと思います.


通りすがり  2005-10-29 09:47:31  No: 18328

等幅で見ないとわかりにくかろうけど、
こんなグラフで、上下スクロールすると見た
--------------------------------
Hoge_1|■■■■■■■            ▲
Hoge_2|■■■■                  □
Hoge_3|■■■■■■■■■■
Hoge_4|■■■■■■■■■■■■  ▼
--------------------------------
めもり|----+----+----+----+----+
--------------------------------

つことで、高さはグラフ部(Image2)の高さとメモリ部(Image1)の高さの足し算。
横幅は、たぶん同じだろうから、どっちでもOK。

この大きさのTBitmapを用意して、Image1とImage2をCopyRectでもしておけばできるかと。


Mr.XRAY  URL  2005-10-29 11:00:14  No: 18329

失礼しました.

>1つのイメージにして保存したいのです。

ということなんですね.最初の質問文の解釈を間違えたようです.
う〜ん.難しい.


aglycon  2005-10-29 18:24:09  No: 18330

Mr.XRAY様、Streamは未知の領域でありますところに、極めて有用なSample codeと資料を提示下さいました。
通りすがり様、まさに私のやりたいところそのものを的確に御教示下さいました。
誠にありがとうございました。
primitivesに貴重な時間を割いて、お付き合い下さいました、big names に無尽の感謝を捧げます。


うーむ  2005-10-29 19:27:36  No: 18331

解決してよかったです。
でも、

>1つのイメージにして保存したいのです。

この質問は変ですよね。質問者はコードを使って棒グラフや目盛りを描いている
のでしょう。だったら、それら両方を一つの画像に描くのがなぜ疑問に思うのか
分からないのです。だから、二つのイメージをそのまま一つのファイルにするのか
な、と考えるのは当然ですよね。


Mr.XRAY  URL  2005-10-30 08:59:47  No: 18332

>分からないのです。だから、二つのイメージをそのまま一つのファイルにするのか
>な、と考えるのは当然ですよね。

私もちょつと前に,この掲示板で失敗しましたが,レスする場合は,その
文面らか,質問された方のレベルと,意図する動作仕様をくみとる,判断
することからから始まるわけです.

つまり,短い文から質問文の背景にあるものを理解する必要がありますね.
中々難しいです.レスしなければいいんですが,
Delphi保存委員会長の立場として (^^ゞ


うーむ  2005-10-30 09:06:53  No: 18333

> レスしなければいいんですが,

了解。


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

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






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