Tôi cố gắng lấy tất cả các giá trị byte từ một Bitmap (System.Drawing.Bitmap). Vì vậy, tôi khóa các byte và sao chép chúng:PixelFormat.Format32bppArgb dường như có thứ tự byte sai
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);
}
}
Tôi đã thử hình ảnh này với một hình ảnh PNG 2x2 rất đơn giản với pixel (đỏ, lục, lam, trắng) mà tôi đã tạo trong Photoshop. Bởi vì định dạng, tôi mong đợi các giá trị sau trong argbData:
255 255 0 0 255 0 255 0
255 0 0 255 255 255 255 255
Nhưng tôi nhận:
0 0 255 255 0 255 0 255
255 0 0 255 255 255 255 255
Nhưng đây là một định dạng BGRA. Có ai biết tại sao các byte có vẻ hoán đổi? Nhân tiện, khi tôi sử dụng hình ảnh trực tiếp cho Image.Source như hình dưới đây, Hình ảnh được hiển thị chính xác. Vì vậy, lỗi của tôi là gì?
<Image Source="D:/tmp/test2.png"/>
Excelent! Tôi chỉ có thể thêm rằng bạn có thể kiểm tra thứ tự byte ("endianness") trong đó dữ liệu được lưu trữ trong kiến trúc máy tính này thông qua [BitConverter.IsLittleEndian] (http://msdn.microsoft.com/en-us/library/system .bitconverter.islittleendian.aspx). – DmitryG
Đó là một điểm tốt về 'BitConverter.IsLittleEndian', nhưng tôi nghĩ rằng nhận xét của HansPassant về endian-ness thực sự có giá trị - đây là một nơi mà người cuối cùng nên ** không được xem xét. [Đây] (http://commandcenter.blogspot.com.au/2012/04/byte-order-fallacy.html) một bài viết tuyệt vời về chủ đề này .. – Jonno