2012-04-13 2 views
3

Я искал через посты на этом сайте, и я наткнулся на это: How do I get the colour of a pixel at X,Y using c#?получить цвет пикселя в случае

бы этот метод все еще эффективен для пытаться получить цвет пикселя только внутри формы?

Если нет, то каким образом можно было бы по существу «отобразить» форму в 2D-массиве значений цвета?

Например, у меня есть игра Tron, и я хочу проверить, не содержит ли следующее местоположение светового байка другой светотень.

Спасибо, Ian

ответ

3
using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 

sealed class Win32 
{ 
    [DllImport("user32.dll")] 
    static extern IntPtr GetDC(IntPtr hwnd); 

    [DllImport("user32.dll")] 
    static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); 

    [DllImport("gdi32.dll")] 
    static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); 

    static public System.Drawing.Color GetPixelColor(int x, int y) 
    { 
     IntPtr hdc = GetDC(IntPtr.Zero); 
     uint pixel = GetPixel(hdc, x, y); 
     ReleaseDC(IntPtr.Zero, hdc); 
     Color color = Color.FromArgb((int)(pixel & 0x000000FF), 
        (int)(pixel & 0x0000FF00) >> 8, 
        (int)(pixel & 0x00FF0000) >> 16); 
     return color; 
    } 
} 

Используя это, вы можете сделать:

public static class ControlExts 
{ 
    public static Color GetPixelColor(this Control c, int x, int y) 
    { 
     var screenCoords = c.PointToScreen(new Point(x, y)); 
     return Win32.GetPixelColor(screenCoords.X, screenCoords.Y); 
    } 
} 

Таким образом, в вашем случае вы можете сделать:

var desiredColor = myForm.GetPixelColor(10,10); 
+0

У меня проблема с линией «return Win32». Visual Studio хочет изменить его на Microsoft.Win32. Я использую Visual Studio 2010. Есть ли библиотека, которую я должен импортировать или что-то еще? –

+0

Извините, я редактировал свой пост. – Bill

+0

Это решение не чистое. «IntPtr.Zero» предоставит вам рабочий стол dc и могут быть окна поверх вашего окна. Лучше: получить свойство 'Handle' элемента управления, из которого вы хотите получить цвет. [Сравнить] (http://stackoverflow.com/a/24759418/1442225) – Bitterblue

0

Вы можете использовать метод GetPixel, чтобы получить цвет.

например.

// Создайте объект Bitmap из файла изображения. Bitmap myBitmap = новый битмап ("Grapes.jpg");

// Получите цвет пикселя внутри myBitmap. Цвет pixelColor = myBitmap.GetPixel (50, 50);

Это может быть другой способ сделать это для другой ситуации для деталей click here

using System; 
    using System.Drawing; 
    using System.Runtime.InteropServices; 


sealed class Win32 
    { 
     [DllImport("user32.dll")] 
     static extern IntPtr GetDC(IntPtr hwnd); 

     [DllImport("user32.dll")] 
     static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); 

     [DllImport("gdi32.dll")] 
     static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); 

     static public System.Drawing.Color GetPixelColor(int x, int y) 
     { 
     IntPtr hdc = GetDC(IntPtr.Zero); 
     uint pixel = GetPixel(hdc, x, y); 
     ReleaseDC(IntPtr.Zero, hdc); 
     Color color = Color.FromArgb((int)(pixel & 0x000000FF), 
        (int)(pixel & 0x0000FF00) >> 8, 
        (int)(pixel & 0x00FF0000) >> 16); 
     return color; 
     } 
    } 
+0

, используя этот метод, есть способ быстро «скриншот» текущего экземпляра? –

+0

Информация о снимке экрана http://stackoverflow.com/questions/1163761/c-sharp-capture-screenshot-of-active-window – Adil

0

Вы можете использовать метод от вопроса, на который ссылался получить цвет пикселя от вашей формы, вы бы просто необходимо выполнить, если пиксель находился в пределах вашей формы, и вам нужно будет перевести координаты из вашей формы в координаты экрана и наоборот.

EDIT: После немного подумать, это было бы неплохо, если бы кто-то открыл другое окно поверх вашей формы! Лучше всего, чтобы выяснить, другой способ сделать это, я думаю ...

Смежные вопросы