BitBltで取得した画像の減色方法について

解決


男児  2006-08-19 04:15:17  No: 22924

BitBltから画面の一部を取得し、TBitmapにまで受け渡し作業をした後で
減色をしようとTBitmap.PixelFormat := pf8bit;のようにすると
実行時に「このコマンドを実行するのに十分な記憶域がありません。」と
エラーが出ます。PixelFormatを使わなければ問題なく最後までいくので
すが減色したいので。

TBitmapに受け渡す時、HBitmapから代入しているのですがそういう事が
原因でPixelFormatが使用できないのでしょうか?
PixelFormatを使わずとしてもBitBltからTBitmapに至る過程で減色するには
どうしたらいいのでしょうか?何か方法があればよろしくお願いします。


もにゃ  2006-08-19 07:36:30  No: 22925

>TBitmapに受け渡す時、HBitmapから代入しているのですが
の意味が分かりません。
とりあえず最小コードで動作確認しました。

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp :TBitmap;
  bmp2:TBitmap;
begin
  bmp:=TBitmap.Create;
  bmp.LoadFromFile('test.bmp');

  bmp2:=TBitmap.Create;
  bmp2.Width :=50;
  bmp2.Height:=50;
  BitBlt(bmp2.Canvas.Handle,0,0,50,50,bmp.Canvas.Handle,0,0,SRCCOPY);
  bmp2.PixelFormat:=pf1bit; //pf8bit
  bmp2.SaveToFile('aaa.bmp');
  bmp2.Free;

  bmp.Free;
end;


男児  2006-08-19 10:28:14  No: 22926

ありがとうございます。
画像ファイルからではなく画面から実際に取得していくと
HBitmapを使うんじゃないかな?と思いますがどうなんで
しょうか?


えーと  2006-08-19 12:03:08  No: 22927

BitBlt() でデスクトップから TBitmap に写し取るんですから
HBitmap は関係ありません。

「delphi キャプチャ」で検索するとたくさん見つかります。

例えば

http://www.hi-ho.ne.jp/tadokoro/menu/menu8_3.html


もにゃ  2006-08-19 13:43:54  No: 22928

HBitmapは一般的な表現じゃないですね。
恐らくデバイスコンテキストのハンドルだとは検討つきますけど。
ビットマップのハンドルとの違いは調べて損はないですぞ。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_bitblt.asp

procedure TForm1.Button2Click(Sender: TObject);
var
  bmp:Tbitmap;
  dc:hdc;
begin
  bmp:=Tbitmap.Create;
  bmp.width :=100;
  bmp.height:=100;
  dc:=getdc(0);
  BitBlt(bmp.canvas.handle,0,0,bmp.width,bmp.height,dc,0,0,srccopy);
  releasedc(0,dc);

  bmp.PixelFormat:=pf1bit;
  bmp.SaveToFile('bbb.bmp');
  bmp.free;
end;


男児  2006-08-19 22:50:08  No: 22929

もにゃさん、えーとさん  ありがとうございます
HBitmap関係なくできますね。
だいぶ前のソースなんでどうやって作ったか忘れましたが
目的を達成するためにあちこちのサンプルから繋ぎ繋いだ
のかもしれません^^;
だいたいこんな感じで書いていました。

var
bit: tbitmap;
Bitmap: HBitmap;
D, DC: HDC;

begin
DC:=CreateDC('DISPLAY', nil, nil, nil);
d:=CreateCompatibleDC(dc);
Bitmap:=CreateCompatibleBitmap(DC, xx, yx);
SelectObject(D,Bitmap);
BitBlt(D, 0, 0, xx, yx, dc,widsi,heisi, srccopy); 
bit:=TBitmap.Create;
Bit.Width:=100;
Bit.Height:=100;
Bit.Handle:=Bitmap;

上記が修正前のやつです。
> BitBlt(bmp2.Canvas.Handle,0,0,50,50,bmp.Canvas.Handle,0,0,SRCCOPY);
このやり方は以前にわかってたはずなのですがなぜ直接渡さなかったのか記憶に
残っていません^^;
無事解決できました。ありがとうございました^^お二人に感謝します^^


男児  2006-08-19 22:50:54  No: 22930

チェックし忘れてました^^;


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

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






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