2010-11-21 11 views
7

मैं स्क्रीन पर कहीं भी पिक्सेल के रंग का नमूना देने के लिए एक .NET ऐप में gdi32.dll से GetPixel() का उपयोग कर रहा हूं। यह ठीक काम करता है लेकिन यह मेरे लिए एक प्रमुख प्रदर्शन बाधा है।क्या GDI GetPixel() के लिए कोई तेज विकल्प है?

क्या ऐसा करने का कोई तेज़ तरीका है?

+2

आपको किस तरह के उपयोग की आवश्यकता है? स्क्रीन पर एक क्षेत्र को पकड़ना और उसके बाद नमूना पिक्सेल को पकड़ना उपयोगी हो सकता है। – hometoast

+0

मेरा ऐप उपयोगकर्ता को रीयलटाइम में स्क्रीन पर कहीं भी (मेरे ऐप के बाहर) रंग का नमूना देने की अनुमति देता है। +1 किसी क्षेत्र में प्रतिबंधित करने के बारे में अच्छा विचार: मैं देखूंगा कि मैं ऐसा कर सकता हूं या नहीं। – stucampbell

उत्तर

8

Bitmap की विधि LockBits() विधि का उपयोग कर पिक्सेल तक तेजी से पहुंच संभव है। यह आपको पिक्सेल डेटा की शुरुआत में पॉइंटर युक्त ऑब्जेक्ट पर वापस लाएगा और आप स्मृति तक पहुंचने के लिए असुरक्षित कोड का उपयोग कर सकते हैं।

http://www.bobpowell.net/lockingbits.htm

+0

धन्यवाद। मैंने उभारा है क्योंकि यह कुछ अन्य छवि मैनिप्ल्यूशन के लिए एक उपयोगी लेख है जो मैं कर रहा हूं। लेकिन यह स्क्रीन पर कहीं भी पिक्सेल का रंग पाने में मेरी सहायता नहीं करता है (जब तक कि मैं पहले स्क्रीनशॉट नहीं लेता, जो मैं नहीं चाहता)। – stucampbell

5

GetPixel दो कारणों के लिए धीमी है:

  1. जब से तुम मतदान स्क्रीन हैं - GetPixel के लिए हर कॉल वीडियो ड्राइवर के लिए एक सौदे, जो बारी में पिक्सेल लेता है की ओर जाता है वीडियो मेमोरी से डेटा।

    डीआईबी पर GetPixel का उपयोग करके कॉन्सस्ट्रास्ट में बहुत तेज है।

  2. वैसे भी GetPixel निर्देशांक कतरन/परिवर्तनों और आदि सहित कई चीज़ें करता

तो है कि अगर आप एक बार में कई पिक्सेल मान क्वेरी करने के लिए उपयोग कर रहे हैं - आप एक ही में यह व्यवस्था करने का प्रयास करना चाहिए जीडीआई/वीडियो चालक के लिए लेनदेन।

जीडीआई का उपयोग करके आपको पर्याप्त आकार का डीआईबी बनाना चाहिए (CreateDIBSection देखें)। सृजन के बाद आपको छवि बिट्स डेटा पर प्रत्यक्ष सूचक दिया जाएगा। फिर छवि भाग को अपने डीआईबी पर कॉपी करें (BitBlt देखें)। इससे पहले कि आप वास्तव में डीआईबी की सामग्री की जांच करें (क्योंकि वीडियो ड्राइवर एसिंक्रोनस ड्राइंग कर सकते हैं) से पहले GdiFlush पर कॉल करना न भूलें।

जीडी + का उपयोग करके आप वास्तव में थोड़ा सरल वाक्यविन्यास के साथ ऐसा ही कर सकते हैं।

+0

धन्यवाद। मैं इसे आज़माउंगा। – stucampbell