2011-01-29 8 views
6

ピクセルのRGB値を画面上の異なるx、y座標で取得したいと考えています。 C++でこれをどうやって行うのですか?C++でのピクセルカラーの取得

私は自分のガウスのぼかし効果を作成しようとしています。

これは、Windows 7で

だろう編集実行するには、このために含める必要がどのようなライブラリ

私は行くしている:あなたは画面全体のデバイスコンテキストを取得するためにNULLウィンドウ上GetDCを使用することができ、かつGetPixelへの呼び出しでそれをフォローアップすることができます

#include <iostream> 

using namespace std ; 

int main(){ 

    HDC dc = GetDC(NULL); 
    COLORREF color = GetPixel(dc, 0, 0); 
    ReleaseDC(NULL, dc); 

    cout << color; 

} 
+1

情報が不十分です。あなたはなぜそれをしたいのか説明できますか?また、これはOS固有のものです。 –

+0

申し訳ありませんが、私は詳細を追加しました。 – rectangletangle

答えて

7

前の記事で説明したように、Win32 APIのGetPixel関数が必要です。

GetPixelはgdi32.dllの中にあります。適切な環境設定がある場合は、windows.h(wingdi.hを含む)を含めることができ、黄金色にする必要があります。

何らかの理由で最小限の環境設定がある場合は、gdi32.dllでLoadLibraryを直接使用することもできます。

GetPixelの最初のパラメータはデバイスコンテキストのハンドルで、GetDC関数(<windows.h>でも利用可能)を呼び出して取得できます。

dllからGetPixelをロードして、カーソルがどこにある場合でもピクセルの色をプリントする基本的な例を次に示します。

#include<windows.h> 
#include<stdio.h> 

int main(int argc, char** argv) 
{ 
    FARPROC pGetPixel; 

    HINSTANCE _hGDI = LoadLibrary("gdi32.dll"); 
    if(_hGDI) 
    { 
     pGetPixel = GetProcAddress(_hGDI, "GetPixel"); 
     HDC _hdc = GetDC(NULL); 
     if(_hdc) 
     { 
      POINT _cursor; 
      GetCursorPos(&_cursor); 
      COLORREF _color = (*pGetPixel) (_hdc, _cursor.x, _cursor.y); 
      int _red = GetRValue(_color); 
      int _green = GetGValue(_color); 
      int _blue = GetBValue(_color); 

      printf("Red: 0x%02x\n", _red); 
      printf("Green: 0x%02x\n", _green); 
      printf("Blue: 0x%02x\n", _blue); 
     } 
     FreeLibrary(_hGDI); 
    } 
    return 0; 
} 
+0

これを数ピクセル以上で実行したい場合、 'GetPixel'はdog slowです。高速な方法は、互換性のあるDCを作成し、そこにDIBSectionを作成して選択し、そのピクセルをバックアップするメモリに直接アクセスすることです。 –

12

HDC dc = GetDC(NULL); 
COLORREF color = GetPixel(dc, x, y); 
ReleaseDC(NULL, dc); 

もちろん、効率を上げるためにすべてのピクセル読み取りを行っている間にデバイスコンテキストを1回だけ取得して解放したいとします。

+0

@ Anteater7171- Visual Studioからビルドしている場合は、 '#include 'で十分であるはずです。私は何年も前にこのトリックを使ったことがあります。 – templatetypedef

+0

@ Anteater7171-申し訳ありませんが、私はそのコンパイラについて何も知らないので、あなたを助けてくれません。 'gdi32.lib'のようないくつかのシステムDLLファイルにリンクしたいと思うかもしれませんし、MSDNで特定のライブラリが必要であるかどうか調べる価値があります。 – templatetypedef

関連する問題