キャプチャについて


アス  2006-07-03 21:01:11  No: 22352

あるソフトの画面中のある小さな部分が、状況によって色が変わります。
具体的には、ランプの絵が、システムが正常なら緑、異常なら赤になります。

そこで、このアプリ上のランプの位置の色を取得して、システムの状況を
常時監視したいと思っています。

こういった場合、アプリの、又は画面全体のキャプチャを行って、Bitmapを
作成し、ランプの位置の色を取得すれば良いと思いますが、ランプの大きさは
16×16ピクセル程度ですので、この部分だけのキャプチャを行えば効率はいいし、
システムにも負担は掛けなくて済むと思っております。

こういった、ある場所だけのキャプチャって出来ますでしょうか?


前提条件  2006-07-03 21:28:00  No: 22353

そのソフトが常に位置固定で再前面ならば、GetPixelでイケル


カレーライズ  2006-07-04 09:15:53  No: 22354

もし、最前面でない場合で位置固定なら そのランプの位置に他のウィンドウが重ねっていないという前提ならば  デスクトップのキャプチャをしてそこから  CopyRectを使えばできますねw
  もしくは  アスさんが言われているソフトのウィンドウハンドルを取得してそこからランプの相対位置を計算して  その部分だけをキャプチャーし続ければ  ソフトのウィンドウが移動しても常にキャプチャーできますよ♪


アス  2006-07-04 18:04:39  No: 22355

前提条件さん、ありがとうございます。
以下のようにやってできました。

  DispDC := CreateDC('DISPLAY', nil, nil, nil);
  try
    Clr := GetPixel(DispDC, 100, 100);
  finally
    DeleteDC(DispDC);
  end;

1回のキャプチャが約4ms位でしたので、負担を掛けずにできそうです。

カレーライズさんの方法ですが、一旦デスクトップ全体、若しくは
対象ウィンドウのキャプチャを行ってから、欲しい部分のCopyRectを
行うようになると思うのですが、これだとシステムに負担を掛けそうなんですが、
どうなんでしょうか?(まだ試しては無いのですが・・・)


にょ。  2006-07-04 18:51:14  No: 22356

CopyRectって言ってるのだから。
「デスクトップのキャプチャ」てのがデバイスコンテキストのハンドル取得の事でしょう。1pixcelでないならBitBltの方が簡単で早い気がします。


カレーライズ  2006-07-05 07:22:21  No: 22357

たしかにCopyRect()では 少し負担がかかるかも。でも  最終的には常時監視したいと言われている  タイマーの間隔をさほど大きくしなかったら問題ないのでは・・・

  > Clr := GetPixel(DispDC, 100, 100);
  上記の方法でできた言われていることは、初めから16*16Pixelを内の1Pixelを調べたかったのでしょうか??なら  絶対にGetPixelが速いですよ。わたしは16*16のサイズを常にキャプチャーし続けたいのかと思っていたのですが。


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

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






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