비트 맵 (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);
}
}
은 내가 포토샵에서 만든 픽셀 (빨강, 녹색, 파랑, 흰색)와 매우 간단한 2 × 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에 직접 이미지를 사용하면 이미지가 올바르게 표시됩니다. 내 잘못은 뭐니?
<Image Source="D:/tmp/test2.png"/>
Excelent! 이 컴퓨터 아키텍처에서 데이터가 저장되는 바이트 순서 ("endianness")는 [BitConverter.IsLittleEndian] (http://msdn.microsoft.com/en-us/library/system)을 통해 확인할 수 있습니다. .bitconverter.islittleendian.aspx) 필드. – DmitryG
'BitConverter.IsLittleEndian'에 대한 좋은 지적이긴하지만, @ HansPassant의 엔디안에 대한 언급은 정말로 가치 있다고 생각합니다. 이것은 엔디안을 고려하지 말아야 할 곳입니다. [Here 's] (http://commandcenter.blogspot.com.au/2012/04/byte-order-fallacy.html)이 주제에 대한 훌륭한 기사입니다. – Jonno