バイナリデータにするには?

解決


メンボー  2005-11-10 01:20:01  No: 18552

教えてください。
以下の処理を行いたいのですが、どうすればよいでしょうか?

1.デスクトップのデータを読み込みます。
2.ビットマップデータを Form に貼り付けた Image1 に描画します。
3.Image1 の縦・横2分の1サイズのImage2 に Assign します。
4.Image2 に表示されているデータを MemoryStream に保存します
5.MemoryStream のデータをファイルに保存します。
6.ファイルを MemoryStream に読み込みます。
7.Image2 にデータを表示します。

デスクトップのデータを読み込んで TBitmap に取り込み、
Image1 に表示するところまではできました。
デスクトップの画像が小さく(1600x1200->80x64)なって表示されています。
この、80×64の画像データをバイナリデータ(TMemoryStream)として
取り込みたいのです。

環境は  Windows2000、WindowsXP  で  Delphi6、Delphi7  です。


りおりお  2005-11-10 01:42:52  No: 18553

> 80×64の画像データをバイナリデータ(TMemoryStream)として
> 取り込みたいのです。

コンピュータのデータはすべてバイナリデータですけど。
「画像データをバイナリにする」ということの意味が不明です。

ビットマップ形式にするのは簡単です。 Canvas の StrechDraw や CopyRect
をつかって画像をコピーして SaveToFile するだけです。


りおりお  2005-11-10 01:44:32  No: 18554

> バイナリデータ(TMemoryStream)として取り込みたいのです。

それでしたら、TBitmap には SaveToStream() メソッドもあります。


メンボー  2005-11-10 02:10:06  No: 18555

りおりおさんすみません。
確かに意味はおかしいですね。
Bitmap 形式でデータを出力させたいので、
簡単にセーブするために TMemoryStream で SaveToFile としてだけで
Bitmap ファイルが作成できるようなデータと言う意味です。
これでも少し日本語変なのかも知れませんけど
意味というかやりたいことがわかってもらえますでしょうか?

で、現在は 元のデータが BmpSource にあり、
Image1.Width,Image.Height を 60,45 、Stretch=True に設定して 
Image1.Picture.Bitmap.Assign(BmpSource) で Image1に縮小した
絵が表示されています。

わからないのはこの 60×45 サイズのビットマップデータを
BmpDest に作成したいのです。

ちなみに 
TBitmap.SaveToStream(MemStr) の後 MemStr.SaveToFile('作成.bmp')
もしくは  TBitmap.SaveToFile('作成.bmp') 
として、Windowsのペイントソフト等で読み込めるのでしょうか?

目的は
MemStr.SaveToFile('作成.bmp');
として作成されたファイルがビットマップ形式のファイルであること
なのですが。


メンボー  2005-11-10 03:31:03  No: 18556

以下のように作成してみました。
BmpSource には 1600X1200 のビットマップデータがあります。
Image1 (現在 60X45)は縮小されたデータが表示されています。
BmpDest に データをコピーしましたが、縮小されたデータではなく
1600X1200 の左上の 60X45 の部分だけがコピーされます。

procedure TForm1.Button1Click(Sender: TObject);
var
 Rect Area;
begin
 GetDeskTopBitmap(BmpSource);              //←DeskTop の画像取得
 Image1.Picture.Bitmap.Assign(BmpSource);  //←Image1 に貼り付け

 BmpDest.Width  := Image1.Width;
 BmpDest.Height  := Image1.Height;
 Area = Rect(0, 0, Image1.Widht - 1, Image1.Height - 1);
 BmpDest.Canvas.CopyRect(Area, Image1.Canvas, Area);
 BmpDest.SaveToFile('D:\Test.bmp');

 ShowMessage(IntToStr(MemStr.Size));
end;


りおりお  2005-11-10 03:52:54  No: 18557

> CopyRect(Area, Image1.Canvas, Area);

この部分、ヘルプでよく読んでください。


りおりお  2005-11-10 05:42:38  No: 18558

TImage は保持している画像のサイズと目に見えるように表示してる画像のサイズが
違っています。(今の場合)これがヒントです。

> BmpDest.Canvas.CopyRect(Area, Image1.Canvas, Area);

この結果が

> 1600X1200 の左上の 60X45 の部分だけがコピーされます。

こうなるのはそのためです。


メンボー  2005-11-10 17:25:02  No: 18559

りおりおさんどうもありがとうございます。
サイズが小さくなりました。
でも、ちょっとおかしいと思われるところがあります。

縮小した画像は32ビット(デスクトップ表示)だったのに
色圧縮されたような絵になってしまいます。
どうしてでしょうか?

ソースは以下だけです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  BmpSource  := TBitmap.Create;
  BmpDest    := TBitmap.Create;
  BmpDest.Width  := 320;
  BmpDest.Height  := 240;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BmpSource.Free;
  BmpDest.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetDeskTopBitmap(BmpSource);
  BmpDest.Canvas.CopyRect(Rect(0, 0, BmpDest.Width, BmpDest.Height),
  BmpSource.Canvas, Rect(0, 0, BmpSource.Width, BmpSource.Height));
  BmpDest.SaveToFile('D:Test.bmp');
end;


ウォレス  2005-11-10 18:13:25  No: 18560

GetDeskTopBitmapの中が不明ですが、
StretchDrawを使ってはどうでしょうか。
縮小のアルゴリズムが違うようです。
StretchDrawは明らかに単純間引き、CopyRectはなんだかうまく文字部分を優先的に残すようになってるみたいです。

 BmpDest.Canvas.CopyRect(Rect(0, 0, BmpDest.Width, BmpDest.Height),
                        BmpSource.Canvas,
                        Rect(0, 0, BmpSource.Width, BmpSource.Height)
                        );
 BmpDest.SaveToFile('C:\Test(copyrect).bmp');

 BmpDest.Canvas.StretchDraw(Rect(0, 0, BmpDest.Width,                                       BmpDest.Height),
                        BmpSource);

 BmpDest.SaveToFile('C:\Test(strechdraw).bmp');


メンボー  2005-11-10 20:35:01  No: 18561

りおりおさん
ウォレスさん
ありがとうございました。
よくなりました。


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

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






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