RGB値を取得するには

[戻る]
はれ 2001/11/06(火) 16:48:29
VC++をはじめたばかりで、参考書と格闘しています。
 画像の上にカーソルが移動したとき、そのピクセルのRGB値を取得
するにはどうしたらよいのか、ヒントをいただけないでしょうか?
今は下のようになっていますが、'GetPixel' : 関数が不正な 2 個
の実引数をともなって呼び出されました。というエラーがでます。

void CKanaDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
    int r,g,b;
    COLORREF color;


    for(point.x=25;point.x<282;point.x++)
        for(point.y=25;point.y<282;point.y++){
            color=GetPixel(point.x,point.y);
            r=GetRValue(color);
            g=GetGValue(color);
                       b=GetBValue(color);
            m_str3.Format("RGB値( %d , %d , %d )",r,g,b);
        }
    UpdateData(FALSE);
    
    CDialog::OnMouseMove(nFlags, point);
}
point.x,point.yはクライアント座標、m_str3はスタティックテキストに割り当てた
変数です。

全く別の資料で、OnDraw(CDC* pCD)関数のなかで、color=pDC->GetPixel(x,y)
と言う記述があったので使えないかな?と思ってやってみたのですが・・・
ぜんぜんわかってなくて恥ずかしいですが、もしよかったらヒントをください。

sugar 2001/11/06(火) 20:15:44
> color=GetPixel(point.x,point.y);
>           
この場合、GetPixel()はWindowsAPIとして認識されているんだと思います。
::GetPixel()は、3つの引数が必要です。
MSDNで確認してみてください。

OnDraw(CDC* pCD)関数のなかで見つけられた、color=pDC->GetPixel(x,y)という記述は、
CDCクラスのGetPixel()メソッドを示します。
だからこの場合は問題なく処理されるのです。

はれ 2001/11/10(土) 09:36:59
遅くなってすみません。お答えありがとうございます!
試してみますね!!

はれ 2001/11/13(火) 16:36:01
MSDNを見て、

指定された座標のピクセルのRGB(赤、緑、青)値を取得
します。
COLORREF GetPixel(

  HDC hdc, // handle to device context

  int XPos, // x-coordinate of pixel

  int nYPos // y-coordinate of pixel

);
の記述がありました。

つまり、プログラム中で、
color=GetPixel(hdc,x座標の値,y座標の値);とすればいいん
ですよね?hdcのところに0をいれるとエラーは出ないの
ですがRGB値は0,0,0となって正しい値は出てくれませ
ん
HDCってどういうものでしょう??MSDNの中には

hdc
デバイスコンテキストのハンドルを指定します。

hDC 必ず指定します。対象となるオブジェクトの hDC プロパティ
に設定される値を指定します。

と書かれてありました。うーん・・・
申し訳ありませんがもしよかったら教えていただけないでしょうか??

Bun 2001/11/13(火) 17:38:11
MFCをお使いであれば、素直に

CDC *pDC = GetDC();

color = pDC->GetPixel(point.x, point.y);

として、関数の終わりあたりで

ReleaseDC(pDC);

としてDCを解放すればよろしいかと。
( 試してませんけど、多分 (^^; )

(この場合、わざわざハンドルを取得する必要はありません)

はれ 2001/11/14(水) 16:51:00
[[解決]]
 できました♪sugarさんBunさんありがとうございました!!
それと、最初に私がfor文で書いてたところも間違ってました。
誰も見ないかもしれないですが・・・後から参考にする人がい
たら、私はこれで成功しました(^o^)/

本当にありがとうございました。

void CKanaDlg::OnMouseMove(UINT nFlags, CPoint point) 
{    
    COLORREF color;
    int r,g,b;
    CDC *pDC = GetDC();

    if((25<=point.x)&(point.x<=280)&(25<=point.y)&(point.y<=280)){
         color = pDC->GetPixel(point.x,point.y);
    r=GetRValue(color);
    g=GetGValue(color);
         b=GetBValue(color);
    m_str3.Format("RGB値 ( %d , %d , %d )",r,g,b);
        }
      
    ReleaseDC(pDC);
    UpdateData(FALSE);
    
    CDialog::OnMouseMove(nFlags, point);
}

古いスレッドには追加発言できません。