Próbuję uzyskać wszystkie wartości bajtów z bitmapy (System.Drawing.Bitmap). Dlatego zablokować bajty i je skopiować:PixelFormat.Format32bppArgb wydaje się mieć nieprawidłową kolejność bajtów
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);
}
}
Przetestowałem ten obraz z bardzo prostego 2x2 PNG z pikseli (czerwony, zielony, niebieski, biały), który został utworzony w programie Photoshop. Ze względu na format, spodziewałem się następujące wartości w argbData:
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
Ale mam:
0 0 255 255 0 255 0 255
255 0 0 255 255 255 255 255
Ale to jest formatem BGRA. Czy ktoś wie, dlaczego bajty wydają się zamienione? Nawiasem mówiąc, kiedy używam obrazu bezpośrednio do Image.Source, jak pokazano poniżej, obraz jest wyświetlany poprawnie. Więc jaka jest moja wina?
<Image Source="D:/tmp/test2.png"/>
Doskonała! Mogę tylko dodać, że możesz sprawdzić kolejność bajtów ("endianness"), w której dane są przechowywane w tej architekturze komputera za pomocą [BitConverter.IsLittleEndian] (http://msdn.microsoft.com/en-us/library/system .bitconverter.islittleendian.aspx). – DmitryG
To dobry punkt na temat 'BitConverter.IsLittleEndian', ale myślę, że @ komentarz HansPassant o endian-ness jest naprawdę cenny - to jest inne miejsce, w którym endianizm powinien ** nie ** być brany pod uwagę. [Tutaj] (http://commandcenter.blogspot.com.au/2012/04/byte-order-fallacy.html) świetny artykuł na ten temat .. – Jonno