ビットマップ(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);
}
}
私はPhotoshopで作成したピクセルと非常にシンプルな2x2のPNGの画像(赤、緑、青、白)を使って、このイメージをテストしました。
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
しかし、私は得た:そのためのフォーマットで、私はargbData内の以下の値を期待
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!私はあなたが[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