winformの背景色を画面上の特定の点で特定できるようにしたいので、その特定の色に応じていくつかの処置を取ることができます。残念ながら、System.Drawingライブラリは私にそうすることを可能にする方法を指定していないようです。winformsアプリケーションでピクセルの色を決定する
どのように特定のポイントで色を決定する必要がありますか?
winformの背景色を画面上の特定の点で特定できるようにしたいので、その特定の色に応じていくつかの処置を取ることができます。残念ながら、System.Drawingライブラリは私にそうすることを可能にする方法を指定していないようです。winformsアプリケーションでピクセルの色を決定する
どのように特定のポイントで色を決定する必要がありますか?
用途:これは、他の上のわずかに異なるテイクです
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
namespace ColorUnderCursor
{
class CursorColor
{
[DllImport("gdi32")]
public static extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(out POINT pt);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
/// <summary>
/// Gets the System.Drawing.Color from under the mouse cursor.
/// </summary>
/// <returns>The color value.</returns>
public static Color Get()
{
IntPtr dc = GetWindowDC(IntPtr.Zero);
POINT p;
GetCursorPos(out p);
long color = GetPixel(dc, p.X, p.Y);
Color cc = Color.FromArgb((int)color);
return Color.FromArgb(cc.B, cc.G, cc.R);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
X = x;
Y = y;
}
}
}
Win32 APIから遠ざかる場合は、Graphics.CopyFromScreen()
を使用して、画面のコンテンツをBitmap
オブジェクトに描画できます。そこから、Bitmap.GetPixel()
を使用して、正しい色のColor
オブジェクトを取得するだけです。
ここでは、完全なデスクトップ(複数のモニタで動作します)を取得するために使用できるいくつかのコードです:
public Image GetScreenshot()
{
int screenWidth = Convert.ToInt32(System.Windows.SystemParameters.VirtualScreenWidth);
int screenHeight = Convert.ToInt32(SystemParameters.VirtualScreenHeight);
int screenLeft = Convert.ToInt32(SystemParameters.VirtualScreenLeft);
int screenTop = Convert.ToInt32(SystemParameters.VirtualScreenTop);
Image imgScreen = new Bitmap(screenWidth, screenHeight);
using (Bitmap bmp = new Bitmap(screenWidth, screenHeight, PixelFormat.Format32bppArgb))
using (Graphics g = Graphics.FromImage(bmp))
using (Graphics gr = Graphics.FromImage(imgScreen))
{
g.CopyFromScreen(screenLeft, screenTop, 0, 0, new Size(screenWidth, screenHeight));
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.DrawImage(bmp, new Rectangle(0, 0, screenWidth, screenHeight));
}
return imgScreen;
}
は、あなたが「カラー」を決定したいと明言しただけで、RGB値が必要だと明確に述べていないので、すでに回答があります。
人間の目には知覚できない色に変化がある可能性があるため、この区別が必要です。例えば、あなたが色 "青"を検出することに興味があると仮定しよう。値(5,5,240)と(10,10,255)は、(0,0,255)と微妙に異なるだけです。実際、違いは微妙なので、カラースウォッチを並べて比較する必要があり、それでもモニタの品質に左右されます。私のデスクトップモニタでは微妙に異なりますが、私のラップトップでは見分けがつきません。長いストーリーを短縮するために、RGB値は色を決定する悪い方法です。
色の違いを計算するのに役立つ数多くの方法がありますが、最も一般的な方法はDelta-Eです。しかし、迅速かつ汚れた方法がほしいならば、これは殺し過ぎるかもしれません。 RGB空間をHSVに変換し、色相の違いを使って色を決定します。アーメンの例を変更するには、次を得る:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
class CursorHue
{
[DllImport("gdi32")]
public static extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
public static float GetHue(Point p)
{
long color = GetPixel(dc, p.X, p.Y);
Color cc = Color.FromArgb((int)color);
return cc.GetHue();
}
}
ピュアブルーは240前の例(5、5、240)及び(10、10、255)の色相値を持ち、両方の240の色合いを持っています。これは色相がRGBの違いにかなり寛容な手段であることを意味し、その差は計算も簡単です(つまり、色相値の絶対的な差を取る)という意味で良いニュースです。この時点で、色差に対する許容範囲を支配する別のパラメータも導入する必要があります。 15度の色相の許容誤差は、システムをかなり堅牢にする。
はここで彼らは、この作業の理由のより詳細な説明については、許容できる同様の
public static bool AreSimilar(Color c1, Color c2, float tolerance = 15f)
{
return Math.Abs(c1.GetHue() - c2.GetHue() <= tolerance;
}
であるかどうかを判断するために2つの色を比較するサンプルコードです、HSV色空間上で、このウィキペディアarticleを参照してください。
http://stackoverflow.com/questions/1483928/how-to-read-the-color-of-a-screen-pixel – Marco