formにimage1とimage2を縦に並べて配置し、TBitMapを介さずcanvasに直接、image1にはX軸目盛りを、image2には横棒グラフを描画しています。(image2がscrollしてもX軸目盛りを消さない目的です)
全体として、X軸目盛りの付いた横棒グラフが表示されます。
この全体を1つのfileに保存したいのですが、
pictureのSaveToFileメソッドではまとめて保存できません。
どうすればいいのですか?
SaveToStream でおのおのメモリストリームに写し、さらにもうひとつメモリストリーム
に二つのサイズとともに書きうつしてひとつにした後、SaveToFile でひとつのファイル
にします。
TBitmap を作成し、これに image1.picture.bitmap と image2.picture.bitmap を Bitblt し、その後 TBitmap をファイルに保存します。
> image2がscrollしてもX軸目盛りを消さない目的
ひとつのイメージにしたら意味無いんじゃ・・・
ちなみに、保存したファイルはどう扱いたいかにもよるのでは?
再利用(?)で、ペイント等のお絵かきソフトで見たい場合、私なら さんのように、
1つのビットマップとして作成する必要がありますね。
ですが、アプリが使うだけの保存であれば、えーと さんの回答のように、FileStreamで、単純に連結したファイルをつくるのもありかもしれません。
> image2がscrollしてもX軸目盛りを消さない目的
どうやってひとつにできますか? 相対的な位置が決められないから二つの画像に
しているんでしょよね?
質問が不明瞭な点をお詫びいたします。おっ 様のご指摘によって明瞭になりましたことに感謝致します。
再利用目的は、ペイント等で見るためですので、1つのイメージにして保存したいのです。
向かうべき方向は私なら様に示して頂きましたので、解決にします。
皆様ありがとうございました。
>この全体を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.
>(TImageを配置していない)他のForm上でも読出せます.
ウソです.ImageをCreateする必要があります.
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_SaveComponentList2.htm
こんなところも参考になるかも知れません.
ただし,上のURLのコードではSave.... LoadがTFormのメソッドになっています.
TImageDataListのメソッドにした方が使いやすいのではないかと思います.
等幅で見ないとわかりにくかろうけど、
こんなグラフで、上下スクロールすると見た
--------------------------------
Hoge_1|■■■■■■■ ▲
Hoge_2|■■■■ □
Hoge_3|■■■■■■■■■■
Hoge_4|■■■■■■■■■■■■ ▼
--------------------------------
めもり|----+----+----+----+----+
--------------------------------
つことで、高さはグラフ部(Image2)の高さとメモリ部(Image1)の高さの足し算。
横幅は、たぶん同じだろうから、どっちでもOK。
この大きさのTBitmapを用意して、Image1とImage2をCopyRectでもしておけばできるかと。
失礼しました.
>1つのイメージにして保存したいのです。
ということなんですね.最初の質問文の解釈を間違えたようです.
う〜ん.難しい.
Mr.XRAY様、Streamは未知の領域でありますところに、極めて有用なSample codeと資料を提示下さいました。
通りすがり様、まさに私のやりたいところそのものを的確に御教示下さいました。
誠にありがとうございました。
primitivesに貴重な時間を割いて、お付き合い下さいました、big names に無尽の感謝を捧げます。
解決してよかったです。
でも、
>1つのイメージにして保存したいのです。
この質問は変ですよね。質問者はコードを使って棒グラフや目盛りを描いている
のでしょう。だったら、それら両方を一つの画像に描くのがなぜ疑問に思うのか
分からないのです。だから、二つのイメージをそのまま一つのファイルにするのか
な、と考えるのは当然ですよね。
>分からないのです。だから、二つのイメージをそのまま一つのファイルにするのか
>な、と考えるのは当然ですよね。
私もちょつと前に,この掲示板で失敗しましたが,レスする場合は,その
文面らか,質問された方のレベルと,意図する動作仕様をくみとる,判断
することからから始まるわけです.
つまり,短い文から質問文の背景にあるものを理解する必要がありますね.
中々難しいです.レスしなければいいんですが,
Delphi保存委員会長の立場として (^^ゞ
> レスしなければいいんですが,
了解。
ツイート | ![]() |