【VBA×WindowsAPI】GetPixel関数の使い方

GetPixel関数

GetPixel関数は指定した座標のピクセルの色(RGB値)を取得するための関数です。
本関数を使用するにはデバイスコンテキスト(以下DC)にアクセスする必要があります。

DCとは簡単にいえばデバイスの描画担当者のようなものです。
私たち開発者はこのDCという”担当者”に「ウィンドウのこの位置に円を描いてほしい」「ウィンドウのこの位置のピクセルの色を教えてほしい」というような命令をすることで図形の描画やすでに描画されている情報の取得などをすることが可能になります。

WindowsAPIにはこのDCへアクセスするためのハンドルを取得するためのさまざまな関数があり、代表的なものとしてGetDC関数GetWindowDC関数といったものがあります。

 

使用方法

GetPixel関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。

使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。

 icon-code  64bit  

Declare PtrSafe Function GetPixel Lib “gdi32” _
(ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long

icon-code  32bit  

Declare Function GetPixel Lib “gdi32” _
(ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。

 
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。

Private Declare PtrSafe Function~ :モジュール内でのみ呼び出し有効
Public Declare PtrSafe Function~ :モジュール外で呼び出し有効

 
 

構文

GetPixel関数の構文は下記のように書きます。

icon-code GetPixel関数 

lColor = GetPixel(hdc, x, y)

引数

 hdc   (64bit:LongPtr型 / 32bit:Long型) 

DCへのハンドルを指定します。このハンドルが示すDCによって第2,3引数で指示する x, y 座標の基準となる原点位置が変化します。例えば画面全体のDCを指示した場合、画面の左上が原点となりますが、指定のウィンドウがもつDCを指示した場合、そのウィンドウの左上が原点となります。

 
 x
   (Long型) 

色を取得するピクセルのX座標を指定します。
 

 y   (Long型) 

色を取得するピクセルのY座標を指定します。
 

戻り値

 lColor   (Long型) 

戻り値は指定した座標のピクセルのRGB値です。R値、G値、B値がそれぞれ別々に取得できるわけではなくRGB関数の戻り値と同じように、RGBそれぞれの成分が合わさった値がLong型で返されます。たとえば R=255, G=255, B=255の場合は16777215 (&HFFFFFF)が返されます。

指定DCの領域外の座標が入力された場合、戻り値は「-1」が返されます。
※「-1」は定数値「CLR_INVALID (&HFFFFFFFF)」です

 

サンプルコード

以下はGetPixel関数を使って画面の指定座標のピクセル色を取得するサンプルコードです。

下記は画面左上を基準に右(x)方向に100px,下(y)方向に200px地点にあるピクセルの色を取得して、イミディエイトウィンドウにその結果を出力するコードです。これは画面全体をキャプチャしてその画像の指定座標にあるピクセルの色を取得しているイメージです。
画面全体のDCを取得するには、GetDC関数の引数にNULL値(0)を入力します。

 
GetDC関数の引数にウィンドウのハンドルを渡せばそのウィンドウ内(クライアント領域内)での指定座標にあるピクセルの色を取得することができます。こちらは指定のウィンドウのみをキャプチャしてその画像の指定座標にあるピクセルの色を取得しているイメージです。

上記の画面全体の時とは違い見ているのは”指定したウィンドウのみ”なので、画面上で他のウィンドウたちに隠されていたとしても、ピクセルの色を取得することが出来ます。
(※指定ウィンドウが最小化されている場合は取得できません)

 

 icon-share-square  VBA×WindowsAPIまとめページ

その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。

 icon-share-square  参考

Microsoft公式:GetPixel 関数 (wingdi.h) – Win32 apps

2024年3月9日Excel, VBA, Windows API

Posted by Lic