PrintScreenキーのように取りこむには?


ぴちゅう  2002-05-09 00:19:03  No: 50150  IP: [192.*.*.*]

キーボードのPrintScreenキーと同じようにデスクトップ上の画面を取込み、
(できれば、座標・サイズも指定できる。)
その画像をビットマップデータとして張りつけるプログラムはご存知でしょうか?

編集 削除
 2002-05-09 01:03:14  No: 50151  IP: [192.*.*.*]

デスクトップのコンパチブルデバイスコンテキストを作成し
StretchBltとかでいけますよ。

#すげぇ説明へたくそですね。。。

編集 削除
ぴちゅう  2002-05-09 18:04:29  No: 50152  IP: [192.*.*.*]

サンプルプログラムを用意してくださると助かるのですが…。

編集 削除
こころ  URL  2002-05-11 01:48:57  No: 50153  IP: [192.*.*.*]

以下のAPIを検索エンジンでひっかければ
サンプルも見つかるのではないでしょうか。
GetWindowDC
ReleaseDC
GetDesktopWindow
CreateCompatibleBitmap
CreateCompatibleDC
SelectObject
DeleteObject
BitBlt
StretchBlt

編集 削除
ryotaro331  URL  2002-05-11 12:20:47  No: 50154  IP: [192.*.*.*]

GetDC(NULL):
でデスクトップのDCを取得し、
CreateCompatibleDC()とCreateCompatibleBitmap()
で取得するのが宜しいかと思います。

編集 削除
ぴちゅう  2002-05-13 00:25:11  No: 50155  IP: [192.*.*.*]

皆様、ありがとうございます。
お蔭様でとりあえず、次のようなソースでできました。
本当に感謝しています。

COLORREF color;
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// デスクトップを取る
CWnd* pwndDeskTop = GetDesktopWindow();
CDC* pDeskTopDC = pwndDeskTop->GetDC();
// 自分の領域にデスクトップからコピー
dc.BitBlt( 0,0, 200, 200, pDeskTopDC, 0, 0, SRCCOPY );
pwndDeskTop->ReleaseDC(pDeskTopDC);

この後に、

for(j=0;j<yh;j++)
   for(i=0;i<xw;i++){
   color=pDC->GetPixel(x0+i,y0+j);
   r=GetRValue(color);
   g=GetGValue(color);
   b=GetBValue(color);
   c=(r+g+b)/3;
   pDC->SetPixel(x1+i,y0+j,RGB(c,c,c));
   }
のような操作で白黒化を試したのですが、
1度ワークスペースに描写してからGetPixelでは
無駄な処理(ワークスペース内に描写)があって効率が悪い気がします。

デスクトップ上から直接RGB値をとりこみ、メモリ上で処理(この場合は白黒化)、
その後にワークスペース内に描写させるにはどうすれば良いのでしょうか?
質問ばかりですいません。

編集 削除
a  2002-05-13 10:22:54  No: 50156  IP: [192.*.*.*]

CreateCompatibleBitmap
を調べたら幸せになれるかも。。。

編集 削除
こころ  URL  2002-05-14 22:13:07  No: 50157  IP: [192.*.*.*]

二色化、またはそれに準ずる処理を行うのであれば
CreateBitmapまたはCreateDIBSectionを調べてみてください。

編集 削除
いもちぃ  2002-05-15 19:10:00  No: 50158  IP: [192.*.*.*]

> c=(r+g+b)/3;
ちなみに、白黒化の計算式が間違ってます。ご参考まで。

編集 削除
ぴちゅう  2002-05-15 20:01:52  No: 50159  IP: [192.*.*.*]

最終的にはいろいろな処理をしたいので、2値化だけといった
特定の処理ではなく、幅広い処理をできるように考えております。
なお、調べてもいまいちよくわかりませんでした。
引き続き調べていこうと思います。

>いもちぃさん
・・・r*0.3+g*0.59+b*0.11のことですか?
(r+g+b)/3でも「間違っている」とは言えないと思うのですが。

編集 削除
a  2002-05-15 20:06:44  No: 50160  IP: [192.*.*.*]

>>いもちぃさん
>・・・r*0.3+g*0.59+b*0.11のことですか?
>(r+g+b)/3でも「間違っている」とは言えないと思うのですが。
確かにグレースケールの定義は三原色が同値である。
ってことなので、(r+g+b)/3でも「間違っている」とは
いえないかと思います。
でも(r+g+b)/3だと色々問題ありますけどね(^^;

編集 削除
こころ  URL  2002-05-15 22:03:54  No: 50161  IP: [192.*.*.*]

CreateDIBSectionはhBmpを作成し、
そのピクセル列に直接アクセスできるポインタも
同時に取得できるAPIです。

こいつをデバイスに割り当ててデスクトップの画像を
BitBltすればピクセル列として取得できます。

コードみてなかったんであれだったんですが
グレースケール化にしてたんですね・・・。
白黒(二色)ビットマップの場合しかCreateBitmapは使えないです。

編集 削除
こころ  URL  2002-05-15 22:11:30  No: 50162  IP: [192.*.*.*]

ちなみに、CBITMAPを使うのであればGetBitmapBitsでもいいと思います。

編集 削除
いもちぃ  2002-05-16 13:10:43  No: 50163  IP: [192.*.*.*]

>>いもちぃさん
>・・・r*0.3+g*0.59+b*0.11のことですか?
>(r+g+b)/3でも「間違っている」とは言えないと思うのですが。

そんなに厳密なお話なら、白黒化は、白か黒、
グレースケールなら、諧調を持った灰色と白と黒ですね。
白黒テレビも間違いってことになりますね。

もしわかってないときの参考に、とぴちゅうさんのことを思った書き込みに、
「「間違っている」とはいえない」ではなく、せめて
「一般的な白黒化ではないのです」くらいにしておいたほうが、
問題がないかと。
こういった掲示板では、「ご参考まで」など、心を汲んでいただきたい。

編集 削除
いもちぃ  2002-05-16 13:30:37  No: 50164  IP: [192.*.*.*]

書き忘れ。
上の発言に対するお返事は不要です。論議を呼びたいのではなく、単に
意見を述べたまでですので、聞き流しておいて下さい。
※ゴミです、すみません。

編集 削除