2010-01-05 5 views
6
 Bitmap bit1 = new Bitmap(bmpimg , width , height); 
     Bitmap bit2 = new Bitmap(bmp , width , height); 

     Bitmap bmpresult = new Bitmap(width , height); 

     BitmapData data1 = bit1.LockBits(new Rectangle(0 , 0 , bit1.Width , bit1.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 
     BitmapData data2 = bit2.LockBits(new Rectangle(0 , 0 , bit2.Width , bit2.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 
     BitmapData data3 = bmpresult.LockBits(new Rectangle(0 , 0 , bmpresult.Width , bmpresult.Height) , ImageLockMode.ReadWrite , PixelFormat.Format24bppRgb); 

unsafe 
     { 
      int remain1 = data1.Stride - data1.Width * 3; 
      int remain2 = data2.Stride - data2.Width * 3; 
      int remain3 = data3.Stride - data3.Width * 3; 


      byte* ptr1 = (byte*)data1.Scan0; 
      byte* ptr2 = (byte*)data2.Scan0; 
      byte* ptr3 = (byte*)data3.Scan0; 

      for(int i = 0 ; i < height ; i ++) 
      { 
       for(int j = 0 ; j < width * 3 ; j ++) 
       { 
        ptr3[ 0 ] = (byte) (XOR_Operator(ptr1[ 0 ] , ptr2[ 0 ])); 
        ptr1 ++; 
        ptr2 ++; 
        ptr3 ++; 
       } 

       ptr1 += remain1; 
       ptr2 += remain2; 
       ptr3 += remain3; 
      } 


     } 

     bit1.UnlockBits(data1); 
     bit2.UnlockBits(data2); 
     bmpresult.UnlockBits(data3); 

     return bmpresult; 
    } 

यह आवश्यक डेटा के लिए रहने के पाने के लिए है वस्तुओंकोई भी बिटमैपडाटा में स्ट्रैड के फ़ंक्शन को समझा सकता है?

+0

पंक्ति को नीचे जाने के लिए आगे बढ़कर एक मेमोरी पॉइंटर आगे बढ़ सकें, डेटा.स्ट्रैड इसका मूल उद्देश्य क्या है? मैं आशा यू अब समझ सकता हूँ – Badr

उत्तर

7

स्ट्राइड हार्डवेयर आवश्यकताओं कि दुर्भाग्य से एपीआई परत के माध्यम से लीक हो के कारण होती है।

यह महत्वपूर्ण है क्योंकि विंडोज ड्राइवरों को कभी-कभी स्कैनलाइन (छवि में पंक्तियां) स्मृति की गठबंधन की आवश्यकता होती है। यही कारण है कि वे कभी-कभी बड़े होने की अपेक्षा करते हैं।

उदाहरण के लिए यह एमएसडीएन आलेख DIBs and Their Use देखें।

हर scanline DWORD -aligned है। स्कैनलाइन को संरेखण में बफर किया गया है; बफरिंग जरूरी 0.

आपका निपटने के लिए पर्याप्त हो रहा है नहीं है।

+0

ठीक इसके अब अच्छा – Badr

+0

thanx मैं यह है कि के माध्यम से लीक कर रहा है क्योंकि कदम पहले अस्तित्व वहाँ ग्राफिक्स हार्डवेयर कि सका थे एक हार्डवेयर आवश्यकता है नहीं लगता है त्वरण (blitting) करो। अगर मुझे सही याद है तो शुरुआती पीसी पर ग्राफिक प्रदर्शन को अनुकूलित करने के साथ और अधिक करना था जहां सभी ग्राफ़िक ऑपरेशन सीपीयू द्वारा किए गए थे।स्पष्ट कारण पिक्सेल इंडेक्सिंग को आसान बनाना है - 2 बाइट्स की शक्ति को घुमाएं और आप एक गुणा (जिसे धीमा किया जाता है) को खत्म करें – Skizz

+0

इसके अलावा, प्रारंभिक ग्राफिक्स कार्ड ने फ्रेम बफर को स्टोर करने के लिए बिट विमानों का उपयोग किया, जिसका मतलब स्टोर करने का सबसे आसान तरीका था छवियों को उन्हें आठ पिक्सल चौड़ी छवियों में से एक को पैड करना था। आभारी रहें कि अब आपको बिट प्लेन आधारित हार्डवेयर के बारे में चिंता करने की आवश्यकता नहीं है। – Skizz

3

scanlines आम तौर पर processor word सीमाओं पर संरेखित कर रहे हैं।

http://javaboutique.internet.com/tutorials/rasters/index2.html का एक अच्छा आरेख है।

सीपीयू-सुलभ बिटमैप्स लागू करने वाले लोग प्रोसेसर शब्द सीमाओं पर अपनी स्कैनलाइन को संरेखित करना चाहते हैं क्योंकि प्रोसेसर शब्दों तक पहुंचने और छेड़छाड़ करने के लिए मशीन कोड गैर-गठबंधन पते के लिए काफी तेज़ हो सकते हैं।

+0

मैं कुछ विवरण ..... – Badr

+0

thanx जरूरत है इसकी सहायक – Badr

4

स्ट्रइड बाइट्स की संख्या है जो आपके कोड को अगले लंबवत पिक्सेल तक पहुंचने के लिए अतीत होनी चाहिए।

यह छवि के चौड़ाई * पिक्सेल आकार से भिन्न हो सकता है यदि हार्डवेयर को एक निश्चित एकाधिक की चौड़ाई की आवश्यकता होती है।

+0

निश्चित रूप से यह पिक्सल के बजाय बाइट्स को फिर से चालू करना चाहिए क्योंकि एक स्कैनलाइन की शुरुआत से ऑफ़सेट की शुरुआत से ऑफसेट एक पिक्सेल के आकार की आवश्यकता नहीं है। उदाहरण के लिए, एक 24 बिट छवि जो 3 पिक्सल चौड़ी है, प्रति छवि पंक्ति में 9 बाइट्स का उपयोग करती है लेकिन इसे दस (3 1/3 पिक्सल) या बारह बाइट्स (4 पिक्सल) तक पैड किया जा सकता है। – Skizz

+0

आप सही हैं। संपादित। –

1

हाँ, यह आवश्यक है।

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

बिटमैप (पहले अर्थात नीचे स्कैन लाइन) स्मृति में उल्टा संग्रहीत है, तो कदम मूल्य नकारात्मक है। आप कदम मूल्य का उपयोग किए बिना इस तरह के एक बिटमैप पढ़ता था, तो आप सिर्फ पहली पंक्ति स्कैन के बाद कचरा, या एक स्मृति पहुँच त्रुटि मिलेगा।

1

स्ट्रैड वैल्यू बाइट्स की संख्या है जो बिटमैप पिक्सेल की एक पंक्ति का प्रतिनिधित्व करने के लिए लेता है। ताकि आप उपरोक्त दिए गए कोड में

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