ビットマップハンドルhBitmap の(x,y)の画素の色を読み取るプログラムに使うデバイスコンテキストとして、
hDC = CreateCompatibleDC(NULL);
SelectObject(hDC, hBitmap);
rgb = GetPixel(hDC, x,y);
DeleteDC(hDC);
のように、NULL を指定して、画面と互換性のあるメモリデバイスコンテキストを指定したのですが、正しい色が読み出せません。hDC = GetDC(NULL);でも同じく駄目でした。hDCはどのように作ったらよいのでしょう。
なお、関数の中でGetPixel()を使いたいので、hWnd などは使えません。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
訂正です
ラストのパラメータはrgbQ.rgbRedではなくrgbQ.rgbBlueの間違えです。
失礼しました。
//文字の組み立て
::sprintf( arrBufMsg,
"カーソル位置の色は %X, %X, %X, %X, %X, です",
pt.x, pt.y,
rgbQ.rgbRed,
rgbQ.rgbGreen,
rgbQ.rgbRed/*←ココはrgbQ.Blueです・・・*/);
No.2
- 回答日時:
今晩は。
目的は大体わかるのですが・・・>>MSDNでは、「デバイスコンテキストの取得対象となるウィンドウのハンド ルを指定します。NULL を指定すると、GetDC は画面全体を表すデバイスコンテキストを取得します。」とありますが、使えないのですか?
はい。NULLを指定するとデスクトップ(画面領域)のウィンドウハンドルが指定された事になる筈です。
<実行結果>
a = FF FF FF FF ←これはxの事ですか?
b = 80 80 80 ←これはyの事ですか?
c1 = 4F 70 9F ←これは赤の事ですか?
c2 = FF FF FF FF←これは緑の事ですか?
c3 = FF FF FF ←これは青の事ですか?
(1)HBITMAPから直接色彩を取るのでしょうか?
(2)ウィンドウにHBITMAPを描写して、ウィンドウから色彩を取るのでしょうか?
(1)を目的にしているのなら、サンプルで動くはずです。
(2)を目的にしているのなら、WM_PAINTでHBITMAPを描写してからWM_LBUTTONDOWNでウィンドウのデバイスコンテキストを作成して、そちらから色彩を取り出します。
//以下サンプル
//グローバル変数
static const LPCSTR OBMP= "bitmap.bmp";//ビットマップファイル名
static HBITMAPg_hBitmap= 0;
//色彩を取る
static void GetMyColor(const HBITMAP hBitmapIn, const POINT& pt, LPRGBQUAD pOut)
{
//メモリデバイスコンテクストを作成します
HDC hDC = ::CreateCompatibleDC(NULL);
//選択します
::SelectObject(hDC, hBitmapIn);
//x, yに対応する色彩をゲットします
const COLORREF rgb = ::GetPixel(hDC, pt.x, pt.y);
//メモリデバイスコンテキストを消去します
::DeleteDC(hDC);
//色彩の分解です
pOut->rgbRed= GetRValue(rgb);//赤です
pOut->rgbGreen= GetGValue(rgb);//緑です
pOut->rgbBlue= GetBValue(rgb);//青です
}
int CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wP, LPARAM lP)
{
switch(uMsg)
{
case WM_CREATE:
{
//モジュールハンドルを取る
HINSTANCE hInst = ::GetModuleHandle(0);
//ビットマップをロードします
g_hBitmap = (HBITMAP)LoadImage(hInst, OBMP, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
return TRUE;
}
case WM_LBUTTONDOWN:
{
//色彩の受け取りデータ
RGBQUAD rgbQ = {0};
//望む座標
const POINT pt = {2, 0};
//受け取る
::GetMyColor(g_hBitmap, pt, &rgbQ);
//文字のバッファ
char arrBufMsg[256];
//初期化
::ZeroMemory(arrBufMsg, 256);
//文字の組み立て
::sprintf(arrBufMsg,
"カーソル位置の色は %X, %X, %X, %X, %X, です",
pt.x, pt.y,
rgbQ.rgbRed,
rgbQ.rgbGreen,
rgbQ.rgbRed);
//メッセージボックスに出す
::MessageBox(hWnd , arrBufMsg, NULL, MB_OK);
return TRUE;
}
case WM_CLOSE:
{
::DestroyWindow(hWnd);
return FALSE;
}
case WM_DESTROY:
{
//ビットマップが不要なので消去します
::DeleteObject(g_hBitmap);
return FALSE;
}
default:;
}
return ::DefWindowProc(hWnd, uMsg, wP, lP);
}
machongolaさん、再度、回答ありがとうございます。
><実行結果>
>a = FF FF FF FF ←これはxの事ですか?
>b = 80 80 80 ←これはyの事ですか?
>c1 = 4F 70 9F ←これは赤の事ですか?
>c2 = FF FF FF FF←これは緑の事ですか?
>c3 = FF FF FF ←これは青の事ですか?
誤解を招く表示ですいません。
<実行結果>は、関数で得られた値の16進表示出力を、手動で2桁ずつに区切って表示したです。つまり、
? B G R
a = FF FF FF FF ← rgbA()で求めた値
b = -- 80 80 80 ← rgbB()で求めた値
c1 = -- 4F 70 9F ← case WM_CREATE:で取得したhDC、rgbC()で求めた値
c2 = FF FF FF FF ← CreateCompatibleDC(NULL);で取得したhDC、rgbC()で求めた値
c3 = FF FF FF ← GetDC(hWnd);で取得したhDC、rgbCB()で求めた値
です。
>(1)HBITMAPから直接色彩を取るのでしょうか?
>(2)ウィンドウにHBITMAPを描写して、ウィンドウから色彩を取るのでしょうか?
(1)です。おっしゃるとおり、(2)を目的とする可能性もありますね。穴だらけの質問で失礼しました。
>(1)を目的にしているのなら、サンプルで動くはずです。
お教えいただいたサンプルは、C++なのですが、私はC言語なので、そのまま動かせませんでした。しかしCに書き直しましたが、結局、これは、先の関数rgbA()と同じになってしまいました。
この方法ですと、得られる値は-1(FFFFFFFF、無理にRGBに分けると、FF FF FF FF)となり、明らかにエラーになってしまうのです。
No.1
- 回答日時:
うーむ。
一見すると問題がないように見えますな。ちょっと確認
(1)hBitmapはしっかりと作成されてますか?
(2)x, yがあさっての数値を指しているとか?
(3)rgbからr,g,bへの分解で書き間違えたとか?
HBITMAPに対するデバイスコンテキストはCreateCompatibleDC()で良いはずです。
GetDC()はHWNDに対してしか使えないはずです。
hBitmapがDIBであるならば無理やりイメージのポインタをつまみ出してしまったら如何でしょう?
この回答への補足
回答ありがとうございます。
>(1)hBitmapはしっかりと作成されてますか?
>(2)x, yがあさっての数値を指しているとか?
>(3)rgbからr,g,bへの分解で書き間違えたとか?
そのようなことは無いと思います。
>GetDC()はHWNDに対してしか使えないはずです。
MSDNでは、「デバイスコンテキストの取得対象となるウィンドウのハンドルを指定します。NULL を指定すると、GetDC は画面全体を表すデバイスコンテキストを取得します。」とありますが、使えないのですか?
http://msdn.microsoft.com/ja-jp/library/cc428664 …
確認のためのプログラムを作成したところ、やはり、hDCを確保する方法、場所により結果が異なります。
CreateCompatibleDC(NULL);で確保した場合は、
case WM_CREATE:で確保すると正常、そのほかの場所で確保するとFF FF FF FFとなり、明らかにエラーです。
GetDC(NULL); で確保した場合は、
一見まともな値ですが、関数の中で確保する場合と、case WM_LBUTTONDOWN:内で、使う直前に確保する場合で値が違います。
引き続き、ご教示お願いいたします。
<実行結果>
a = FF FF FF FF
b = 80 80 80
c1 = 4F 70 9F
c2 = FF FF FF FF
c3 = FF FF FF
<動作確認プログラム>
int rgbA(HBITMAP hBitmap, int x, int y) {
int rgb;
HDC hDC;
hDC = CreateCompatibleDC(NULL);
SelectObject(hDC, hBitmap);
rgb = GetPixel(hDC, x,y);
DeleteDC(hDC);
return rgb;
}
int rgbB(HBITMAP hBitmap, int x, int y) {
int rgb;
HDC hDC;
hDC = GetDC(NULL);
SelectObject(hDC, hBitmap);
rgb = GetPixel(hDC, x,y);
ReleaseDC(NULL,hDC);
return rgb;
}
int rgbC(HDC hDC, HBITMAP hBitmap, int x, int y) {
int rgb;
SelectObject(hDC, hBitmap);
rgb = GetPixel(hDC, x,y);
return rgb;
}
case WM_LBUTTONDOWN:
x=100; y=100;
a = rgbA(hBitmap, x,y);
b = rgbB(hBitmap, x,y);
c1 = rgbC(hMin,hBitmap, x,y);
hDC = CreateCompatibleDC(NULL);
c2 = rgbC(hDC, hBitmap, x,y);
DeleteDC(hDC);
hDC = GetDC(hWnd);
c3 = rgbC(hDC, hBitmap, x,y);
ReleaseDC(hWnd,hDC);
sprintf(msg,"カーソル位置の色は %X, %X, %X, %X, %X です",a,b,c1,c2,c3);
MessageBox(hWnd,msg,NULL,MB_OK);
break;
case WM_CREATE:
hMin =CreateCompatibleDC(NULL);
hBitmap=(HINSTANCE)LoadImage(hInst,OBMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetDC()とCreateCompatibleDC()
-
画面のちらつきについて
-
ピクチャーコントロールのデバ...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
フォントの大きさ
-
コントロールの書式設定で、“コ...
-
VBAのフォント変更(エクセルか...
-
コンボボックス内の文字サイズ変更
-
エクセルのコントロールツール...
-
他のウィンドウのボタンを自動...
-
vbaから他のアプリを終了
-
ドロップダウンリストのフォン...
-
DateTimePickerでに年月までし...
-
検索の画面がでなくなってしま...
-
メッセージボックスを大きくす...
-
ダイアログボックスで指定した...
-
メッセージボックスの選択ボタ...
-
VB6,リストボックスの特定行の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
ダイアログにビットマップを貼...
-
GetDC()とCreateCompatibleDC()
-
画面がチカチカする
-
C 多角形を半透明に塗る方法
-
ピクチャーコントロールのデバ...
-
Rectangleで、リソースが解放さ...
-
画像処理 ビットマップ ダブ...
-
ウインドウ内全体を一定時間で...
-
TextOutについて
-
VBでFD、USBの有効・無効...
-
メモリデバイスコンテキスト&...
-
ハードコピーをプログラムから...
-
VC++のTextOutの再描画の仕方
-
PrintScreenしたあとに画像を保...
-
SelectObjectについて
-
ダブルバッファの作り方
-
VC++でBitmapとText文字を表示...
-
Windowsプログラミング 画面描...
-
GetPixelに使うHDCの作り方
おすすめ情報