DOBON.NET DOBON.NETプログラミング掲示板過去ログ

マウスポインタ直下にある色を取得

分類:[.NET]

いつもお世話になっております。MASAです。

今回皆様にお聞きしたい点は、グラフィックスに関して、
ペンのサイズ、色を指定して図形を書くことができたのですが、
今回はまったく逆の意味なのですが、設定して図形を描くのではなく
画像(フルカラーや256色)からピクセルの取得をしたいと
思っています。

良く市販ソフトなどで見るのですが、カラー見本みたいにFormに
BMP保存されている画像の上をマウスで通過している際に、別の
PictureBoxにてマウス直下の色が表示されていると言うものです。

PictureBox1_MouseHover上で行うと言う事と、
PictureBox1のマウスのX,Y座標が必要なのは
察しがついたのですが。。。取得方法がわかりません。

よろしくお願いいたします。
自己レスですみません。

GetPixelを使用すると色を取得できると思われるのですが。。
PictureBox1とPictureBox2を作成して、PictureBox1へBITMAP画像を
貼り付け、その画像の上をマウスが通過した際に、マウス直下の色を
PictureBox2へ表示すると言うものです。

Private Sub Form1_Load(省略) Handles MyBase.Load
Dim myBitmap As New Bitmap("C:\TEST.bmp")
PictureBox1.Image = myBitmap
End Sub

Private Sub PictureBox1_MouseHover(省略) Handles PictureBox1.MouseHover
MOUSE_X = Me.MousePosition.X
MOUSE_Y = Me.MousePosition.Y

pixelColor = myBitmap.GetPixel(MOUSE_X, MOUSE_Y)
PictureBox2.BackColor = pixelColor
End Sub

なおMOUSE_X,MOUSE_Yは変数として使用していますが、
GetPixelを実行しようとすると下記エラーメッセージが表示されます。

--------------------------------------------------
'System.ArgumentException' のハンドルされていない例外が system.drawing.dll で発生しました。
追加情報 : 使用されたパラメータが無効です。
--------------------------------------------------
となります。なぜパラメーターが無効なのかわかりません。
どこがいけないのでしょうか?よろしくお願いいたします。
Me.MousePosition.X
Me.MousePosition.Y
が返すのは、画面座標(1024*768とかの領域での座標)で、
myBitmap.GetPixel()
が要求しているのは、画像上の座標。

だから、画像サイズより大きなx,yを渡してしまっている。
> pixelColor = myBitmap.GetPixel(MOUSE_X, MOUSE_Y)

イベントの引数eのe.X、e.Yを使えばよいかと。
pixelColor = myBitmap.GetPixel(e.X, e.Y)
■投稿者/ ピラルク 一般人(28回)-(2003/08/18(Mon) 23:19:29)
■No377に返信(よねKENさんの記事)
いつもお世話になっております。ピラルク様、よねKEN様。

ピラルクさんの言っておられた件について、
Me.MousePosition.X
Me.MousePosition.Y
で取得した値をLabelを貼り付け、値を検証してみると、とんでもない数値でびっくり
いたしました。
Me = このアプリケーション。
MousePosition.XとYはマウスのポジションと言うことで、
勝手ながらこのアプリケーションのマウスの座標と勘違いしてしまいました。

それでよねKENさんの言われたとおりe.Xとe.Yを使用してローカル座標?を取得
することができました。
e As System.Windows.Forms.MouseEventArgsと言う事で、マウスの事を取得する
意味だったとわかりました。

よってローカル座標に変えた所、問題なく動作いたしました。ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板