教えてください。
以下の処理を行いたいのですが、どうすればよいでしょうか?
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 です。
> 80×64の画像データをバイナリデータ(TMemoryStream)として
> 取り込みたいのです。
コンピュータのデータはすべてバイナリデータですけど。
「画像データをバイナリにする」ということの意味が不明です。
ビットマップ形式にするのは簡単です。 Canvas の StrechDraw や CopyRect
をつかって画像をコピーして SaveToFile するだけです。
> バイナリデータ(TMemoryStream)として取り込みたいのです。
それでしたら、TBitmap には SaveToStream() メソッドもあります。
りおりおさんすみません。
確かに意味はおかしいですね。
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');
として作成されたファイルがビットマップ形式のファイルであること
なのですが。
以下のように作成してみました。
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;
> CopyRect(Area, Image1.Canvas, Area);
この部分、ヘルプでよく読んでください。
TImage は保持している画像のサイズと目に見えるように表示してる画像のサイズが
違っています。(今の場合)これがヒントです。
> BmpDest.Canvas.CopyRect(Area, Image1.Canvas, Area);
この結果が
> 1600X1200 の左上の 60X45 の部分だけがコピーされます。
こうなるのはそのためです。
りおりおさんどうもありがとうございます。
サイズが小さくなりました。
でも、ちょっとおかしいと思われるところがあります。
縮小した画像は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;
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');
りおりおさん
ウォレスさん
ありがとうございました。
よくなりました。
ツイート | ![]() |