RGB値を取得するには – プログラミング – Home

通知
すべてクリア

[解決済] RGB値を取得するには


はれ
 はれ
(@はれ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

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
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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

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


返信引用
はれ
 はれ
(@はれ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

遅くなってすみません。お答えありがとうございます!
試してみますね!!


返信引用
はれ
 はれ
(@はれ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

MFCをお使いであれば、素直に

CDC *pDC = GetDC();

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

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

ReleaseDC(pDC);

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

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


返信引用
はれ
 はれ
(@はれ)
ゲスト
結合: 24年前
投稿: 10
Topic starter  

 できました♪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);
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました