2009-04-15 14 views
25

मैं एक्स, वाई का उपयोग कर पिक्सेल का रंग कैसे प्राप्त करूं?मैं एक्स, वाई का उपयोग कर पिक्सेल का रंग कैसे प्राप्त करूं?

परिणामस्वरूप, मैं परिणामों को रंग प्रारूप में परिवर्तित कर सकता हूं। मुझे यकीन है कि इसके लिए एक एपीआई कॉल है।

"मॉनिटर पर किसी दिए गए एक्स, वाई के लिए, मैं उस पिक्सेल का रंग प्राप्त करना चाहता हूं।"

+0

स्क्रीन पर या अपने ऐप्लिकेशन में विंडो में यह कहीं भी है? – ChrisF

+0

बस सामान्य प्रदर्शन। मुझे किसी विशेष घटना की परवाह नहीं है। – MichaelICE

+0

मॉनिटर पर किसी भी दिए गए एक्स, वाई के लिए, मैं उस पिक्सेल का रंग प्राप्त करना चाहता हूं। – MichaelICE

उत्तर

36

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

क्या आप कृपया बता सकते हैं कि आपने 'GetPixelColor' विधि में क्या किया है? (ज्यादातर bitwise भागों) धन्यवाद! –

+1

पिक्सेल = 32 बिट्स int गेटपिक्सेल 32 बिट्स इंट मान बिटटाइज का उपयोग करके प्राप्त करता है, वह 32 बिट्स मानों को 8 बिट मानों में विघटित करता है, इसलिए वह फ़ंक्शन रंग का उपयोग कर सकता है। FromArgb 32 बिट्स मान को 3 -> 8 बिट में परिवर्तित करने के लिए रंग की। वह मास्क का उपयोग उन मानों को रूपांतरित करने के लिए कर रहा है जिनकी उन्हें 0x0000FF00 (केवल सेनकॉन्डे बाइट) के साथ आवश्यकता नहीं है और फिर मानों को स्केल 0: 255 –

10

एक छवि के लिए Bitmap.GetPixel है ... क्या आप इसके बाद क्या कर रहे हैं? यदि नहीं, तो क्या आप कह सकते हैं कि कौन सा x, y मान आपका मतलब है? नियंत्रण पर?

ध्यान दें कि अगर आप कर एक छवि के लिए मतलब है, और आप बहुत सारे पिक्सल के प्राप्त करना चाहते हैं, और आप असुरक्षित कोड के साथ काम करने से परहेज नहीं करते, तो Bitmap.LockBits के लिए कॉल की बहुत सारी की तुलना में बहुत तेजी से हो जाएगा GetPixel

+0

मुझे इसे वर्तमान डिस्प्ले से चाहिए, एक विशेष फ़ाइल नहीं, या एक पेंट बॉक्स का उदाहरण। – MichaelICE

+0

उस मामले में मैं CLARGe के समाधान की सिफारिश करता हूं। –

2

पी/आह्वान समाधान के अलावा, आप एक में स्क्रीन से छवि डेटा प्राप्त करने Graphics.CopyFromScreen उपयोग कर सकते हैं ग्राफिक्स वस्तु। यदि आप पोर्टेबिलिटी के बारे में चिंतित नहीं हैं, हालांकि, मैं पी/इनवोक समाधान की सिफारिश करता हूं।

1

WPF में रेफरी के लिए: (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

में घुमाएं अतिरिक्त जानकारी: 'System.Windows.Media.Color' नेमस्पेस का उपयोग करने के लिए आपको आवश्यकता है संदर्भों में PresentationCore.dll जोड़ने के लिए। –

संबंधित मुद्दे