लगता है कि मैं बिटमैप (System.Drawing.Bitmap) से सभी बाइट मान प्राप्त करने का प्रयास करता हूं। इसलिए मैं बाइट्स ताला और उन्हें कॉपी:PixelFormat.Format32bppArgb में गलत बाइट ऑर्डर
public static byte[] GetPixels(Bitmap bitmap){
if(bitmap-PixelFormat.Equals(PixelFormat.Format32.bppArgb)){
var argbData = new byte[bitmap.Width*bitmap.Height*4];
var bd = bitmap.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
System.Runtime.InteropServices.Marshal.Copy(bd.Scan0, argbData, 0, bitmap.Width * bitmap.Height * 4);
bitmap.UnlockBits(bd);
}
}
मैं पिक्सल (लाल, हरा, नीला, सफेद) है कि मैं में फ़ोटोशॉप बनाया के साथ एक बहुत ही सरल 2x2 PNG छवि के साथ इस छवि का परीक्षण किया। प्रारूप की वजह से, मैं argbData भीतर निम्न मान की उम्मीद:
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
लेकिन मुझे मिल गया:
0 0 255 255 0 255 0 255
255 0 0 255 255 255 255 255
लेकिन यह एक BGRA स्वरूप है। क्या कोई जानता है कि बाइट्स क्यों बदलते हैं? वैसे, जब मैं छवि के लिए सीधे छवि का उपयोग करता हूं, जैसा कि नीचे दिखाया गया है, छवि सही ढंग से दिखायी गयी है। तो मेरी गलती क्या है?
<Image Source="D:/tmp/test2.png"/>
एक्सेलेंट! मैं केवल इतना जोड़ सकता हूं कि आप बाइट ऑर्डर ("एंडियननेस") देख सकते हैं जिसमें डेटा इस कंप्यूटर आर्किटेक्चर में [BitConverter.IsLittleEndian] के माध्यम से संग्रहीत किया जाता है (http://msdn.microsoft.com/en-us/library/system .bitconverter.islittleendian.aspx) फ़ील्ड। – DmitryG
यह 'बिटकॉन्टर.इस्लिटल इंडियन' के बारे में एक अच्छा बिंदु है, लेकिन मुझे लगता है कि एंडियन-नेस के बारे में @ हंसपैसेंट की टिप्पणी वास्तव में मूल्यवान है - यह एक और जगह है जहां एंडियन-नेस ** ** पर विचार नहीं किया जाना चाहिए। [यहां है] (http://commandcenter.blogspot.com.au/2012/04/byte-order-fallacy.html) इस विषय के बारे में एक महान लेख .. – Jonno