trato de obtener todos los valores de byte de un mapa de bits (System.Drawing.Bitmap). Por lo tanto cierro los bytes y copiarlos:PixelFormat.Format32bppArgb parece tener orden de bytes mal
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);
}
}
He probado esta imagen como una imagen PNG 2x2 muy simple con con píxeles (rojo, verde, azul, blanco) que he creado en Photoshop. Debido al formato, que esperaba los siguientes valores dentro del argbData:
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
Pero tengo:
0 0 255 255 0 255 0 255
255 0 0 255 255 255 255 255
Pero este es un formato BGRA. ¿Alguien sabe por qué los bytes parecen intercambiados? Por cierto, cuando uso la imagen directamente para Image.Source como se muestra a continuación, la imagen se muestra correctamente. Entonces, ¿cuál es mi culpa?
<Image Source="D:/tmp/test2.png"/>
¡Excelente! Solo puedo agregar que puede verificar el orden de bytes ("endianness") en el que se almacenan los datos en esta arquitectura de computadora a través de [BitConverter.IsLittleEndian] (http://msdn.microsoft.com/en-us/library/system) .bitconverter.islittleendian.aspx) campo. – DmitryG
Ese es un buen punto sobre 'BitConverter.IsLittleEndian', pero creo que el comentario de @ HansPassant sobre endian-dad es muy valiosa - este es otro lugar donde el endian-dad debería ** ** no ser considerado. [Aquí está] (http://commandcenter.blogspot.com.au/2012/04/byte-order-fallacy.html) un excelente artículo sobre este tema. – Jonno