2010-03-12 13 views

उत्तर

6

यह एक ही होना चाहिए:

function TCanvas.GetPixel(X, Y: Integer): TColor; 
begin 
    RequiredState([csHandleValid]); 
    GetPixel := Windows.GetPixel(FHandle, X, Y); 
end; 
4

आप देख रहे हैं कुछ है कि तुलना में GetPixel/Canvas.Pixel [] तुम बाहर की जाँच करनी चाहिए Bitmap.ScanLine में बेहतर प्रदर्शन के लिए। केवल मुसीबत डेटा तरीके का एक संख्या में व्यवस्थित किया जा सकता है, Bitmap.PixelFormat

0

द्वारा निर्धारित GetPixel समारोह बहुत धीमी है! यदि आपको उच्च (या यहां तक ​​कि स्वीकार्य) प्रदर्शन की आवश्यकता है, तो आपको स्कैनलाइन संपत्ति का उपयोग करना चाहिए। ScanLine [y] बिटमैप में पिक्सल की yth लाइन के लिए एक सूचक है, जो PixelFormat प्रॉपर्टी द्वारा निर्दिष्ट प्रारूप में एन्कोड किया गया है। उदाहरण के लिए, एक 24 बिट बिटमैप के लिए, लाइन प्रारूप

बी 1 G1 आर 1 बी 2 जी 2 आर 2 ... बटालियन Gn आर एन

है अगर बिटमैप की चौड़ाई n है। बाई, जीआई, और री बाइट्स के रूप में क्रमशः पिक्सेल i की नीली, हरी और लाल तीव्रताएं हैं।

+0

क्या मैं पूछ सकता हूं कि मेरे तर्क में क्या गलत है? –

+0

@Ritsaert: क्या आप निश्चित हैं? मैंने अभी एक छोटी बीएमपी फाइल बनाई है (आर, जी, बी) = (0xFF, 0, 0) और इसे स्मृति में देखा। Http://privat.rejbrand.se/hex.png देखें। हाइलाइट बाइट पहली स्कैनलाइन का पहला बाइट है। मेरे लिए यह निश्चित रूप से बाइट्स की तरह दिखता है BBGGRRBBGGRR ... –

+0

मुझे शर्म आती है। तुम सही हो। 24 बिट बिटमैप्स के लिए प्रारूप बीजीआर ऑर्डर में है। –

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