2012-05-27 16 views
7

MSDN संदर्भ: [1] http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx#Y1178Bitmap.Lockbits भ्रम

लिंक से यह है कि पहला तर्क "ताला निर्दिष्ट बिटमैप के भाग के लिए" होगा जो मैं बिटमैप का एक छोटा हिस्सा (होना करने के लिए सेट का कहना है बिटमैप 500x500 है, मेरा आयताकार (0,0,50,50) है) हालांकि लौटाया गया बिटमैपडाटा 1500 (= 500 * 3) का है, इसलिए मूल रूप से प्रत्येक स्कैन क्षैतिज रूप से पूरी तस्वीर को स्कैन करेगा। हालांकि, मैं जो चाहता हूं वह बिटमैप का केवल शीर्ष बाएं 50x50 हिस्सा है।

यह कैसे काम करता है?

उत्तर

9

स्ट्रॉइड हमेशा पूर्ण बिटमैप का होगा, लेकिन स्कैन 0 संपत्ति लॉक आयत के प्रारंभ बिंदु के साथ-साथ बिटमैपडाटा की ऊंचाई और चौड़ाई के अनुसार अलग होगी।

इसका कारण यह है कि पंक्तियों को फिर से चलाने के लिए आपको अभी भी बिटमैप की वास्तविक बिट-चौड़ाई को जानने की आवश्यकता होगी (पते पर आगे बढ़ें)।

जाना के बारे में यह होगा एक आसान तरीका:

var bitmap = new Bitmap(100, 100); 

var data = bitmap.LockBits(new Rectangle(0, 0, 10, 10), 
          ImageLockMode.ReadWrite, 
          bitmap.PixelFormat); 

var pt = (byte*)data.Scan0; 
var bpp = data.Stride/bitmap.Width; 

for (var y = 0; y < data.Height; y++) 
{ 
    // This is why real scan-width is important to have! 
    var row = pt + (y * data.Stride); 

    for (var x = 0; x < data.Width; x++) 
    { 
     var pixel = row + x * bpp; 

     for (var bit = 0; bit < bpp; bit++) 
     { 
      var pixelComponent = pixel[bit]; 
     } 
    } 
} 

bitmap.UnlockBits(data); 

तो यह मूल रूप से वास्तव में सिर्फ पूरे बिटमैप ताला लगा है, लेकिन आप बिटमैप में आयत के ऊपरी-बाएं पिक्सेल के लिए सूचक दे ​​रही है, और स्कैन की चौड़ाई और ऊंचाई को उचित रूप से सेट करना।

+0

धन्यवाद। यह समझ आता है! –

+3

कोई गारंटी नहीं है कि बिटमैप का मार्ग बराबर होगा (चौड़ाई * बाइट प्रति पिक्सेल), इस प्रकार "var bpp = data.Stride/bitmap.Width;" गलत है (आप आसानी से एक अलग कदम के साथ एक बिटमैप बना सकते हैं)। आप प्रति पिक्सल बिट्स के लिए (या (बिटमैप.पिक्सेलफॉर्मैट) >> 11) और 31) बिट्स प्रति पिक्सेल के लिए ((बिटमैप.पिक्सेलफॉर्मैट) >> 8) और 255) का उपयोग कर सकते हैं। –

+0

इसके अलावा, यदि आपके लिए आगे बढ़ना महत्वपूर्ण है, तो आप अपना खुद का बफर आपूर्ति कर सकते हैं और ImageLockMode.UserInputBuffer के साथ आगे बढ़ सकते हैं। –