2009-04-15 23 views
25

Làm cách nào để nhận được màu của pixel tại X, Y khi sử dụng C#?Làm cách nào để nhận được màu của pixel tại X, Y khi sử dụng C#?

Kết quả là tôi có thể chuyển đổi kết quả sang định dạng màu mà tôi cần. Tôi chắc chắn có một cuộc gọi API cho việc này.

"Đối với bất kỳ X, Y nào trên màn hình, tôi muốn lấy màu của điểm ảnh đó".

+0

là bất cứ nơi nào trên màn hình hoặc trong một cửa sổ trong ứng dụng của bạn? – ChrisF

+0

Chỉ hiển thị chung. Tôi không quan tâm đến bất kỳ trường hợp cụ thể nào. – MichaelICE

+0

Đối với bất kỳ X, Y nào trên màn hình, tôi muốn lấy màu của điểm ảnh đó. – MichaelICE

Trả lời

36

Để có được một màu điểm ảnh từ Screen đây là mã từ Pinvoke.net:

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

Bạn có thể giải thích tại sao bạn đã làm những gì bạn đã làm trong phương thức 'GetPixelColor'? (chủ yếu là các bộ phận bitwise) Cảm ơn! –

+1

Pixel = 32 bits int Getpixel có được giá trị 32 bit int sử dụng bitwise anh ta phân tách giá trị 32 bit thành giá trị 8 bit, vì vậy anh ta có thể sử dụng hàm Color.FromArgb để chuyển đổi giá trị 32 bit thành 3 -> 8 bit màu sắc. Ông đang sử dụng mặt nạ để chuyển đổi các giá trị mà anh ta không cần với & 0x0000FF00 (chỉ sencond byte) và sau đó xoay các giá trị theo tỷ lệ 0: 255 –

10

Bitmap.GetPixel cho hình ảnh ... đó là những gì bạn đang theo dõi? Nếu không, bạn có thể nói x, y giá trị bạn có nghĩa là gì? Trên một điều khiển?

Lưu ý rằng nếu bạn làm nghĩa cho một hình ảnh, và bạn muốn nhận được nhiều điểm ảnh, và bạn không nhớ làm việc với mã không an toàn, sau đó Bitmap.LockBits sẽ nhanh hơn rất nhiều so với rất nhiều cuộc gọi đến GetPixel.

+0

Tôi cần nó từ màn hình hiện tại, không phải là một tập tin cụ thể, hoặc thể hiện của một hộp sơn. – MichaelICE

+0

Trong trường hợp đó tôi muốn giới thiệu giải pháp của CLaRGe. –

2

Bên cạnh những giải pháp P/Invoke, bạn có thể sử dụng Graphics.CopyFromScreen để có được những dữ liệu hình ảnh từ màn hình thành một Đối tượng đồ họa. Tuy nhiên, nếu bạn không lo lắng về tính di động, tôi khuyên bạn nên sử dụng giải pháp P/Invoke.

1

Đối với ref trong WPF: (sử dụng PointToScreen)

System.Windows.Point position = Mouse.GetPosition(lightningChartUltimate1); 

    if (lightningChartUltimate1.ViewXY.IsMouseOverGraphArea((int)position.X, (int)position.Y)) 
    { 
     System.Windows.Point positionScreen = lightningChartUltimate1.PointToScreen(position); 
     Color color = WindowHelper.GetPixelColor((int)positionScreen.X, (int)positionScreen.Y); 
     Debug.Print(color.ToString()); 


     ... 

     ... 


public class WindowHelper 
{ 
    // ****************************************************************** 
    [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.Windows.Media.Color GetPixelColor(int x, int y) 
    { 
     IntPtr hdc = GetDC(IntPtr.Zero); 
     uint pixel = GetPixel(hdc, x, y); 
     ReleaseDC(IntPtr.Zero, hdc); 
     Color color = Color.FromRgb(
      (byte)(pixel & 0x000000FF), 
      (byte)((pixel & 0x0000FF00) >> 8), 
      (byte)((pixel & 0x00FF0000) >> 16)); 
     return color; 
    } 
+0

Thông tin bổ sung: để sử dụng không gian tên 'System.Windows.Media.Color' bạn cần để thêm PresentationCore.dll vào tài liệu tham khảo. –

Các vấn đề liên quan