gpt4 book ai didi

c# - PixelFormat.Format32bppArgb 似乎有错误的字节顺序

转载 作者:IT王子 更新时间:2023-10-29 04:26:40 26 4
gpt4 key购买 nike

我尝试从位图 (System.Drawing.Bitmap) 中获取所有字节值。因此我锁定字节并复制它们:

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 图像测试了此图像。由于格式原因,我希望 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"/>

最佳答案

像素数据是ARGB,1个字节用于alpha,1个用于红色,1个用于绿色,1个用于蓝色。 Alpha 是最重要的字节,蓝色是最不重要的。在小端机器上,就像你的和许多其他机器一样,小端先存储,所以字节顺序是 bb gg rr aa。所以 0 0 255 255 等于蓝色 = 0,绿色 = 0,红色 = 255,alpha = 255。那是红色。

当您将 bd.Scan0 转换为 int*(指向整数的指针)时,这种字节顺序细节会消失,因为整数也存储为小字节序。

关于c# - PixelFormat.Format32bppArgb 似乎有错误的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com