为什么我的图像看起来采用Bgra而不是Argb的格式?

所以,我对我刚刚运行的快速测试感到非常困惑。 我在C#中进行一些图像处理。 Get / SetPixel()已被certificate太慢了,所以我使用LockBits来获取原始数据。

但是,我似乎遇到了一个我无法弄清楚的情况。 在扫描图像时,似乎每个像素按照顺序布置为Bgra,即蓝色字节,绿色字节,红色字节和alpha。 我的印象是他们将以Argb的顺序排列。 这是我正在使用的代码示例。

BitmapData baseData = m_baseImage.LockBits(new Rectangle(new Point(0, 0), m_baseImage.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Bitmap test = new Bitmap(m_baseImage.Width, m_baseImage.Height); byte* ptr = (byte*)baseData.Scan0; for (int y = 0; y < m_baseImage.Height; ++y) { for (int x = 0; x < m_baseImage.Width; ++x) { // this works, image is copied correctly Color c1 = Color.FromArgb(*(ptr + 3), *(ptr + 2), *(ptr + 1), *ptr); // below does not work! Bytes are reversed. //Color c1 = Color.FromArgb(*ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3)); test.SetPixel(x, y, c1); ptr += 4; } } m_baseImage.UnlockBits(baseData); pictureBox1.Image = m_baseImage; pictureBox2.Image = test; 

抓取基本图像颜色的第一行起作用,第二行不起作用。 我很确定我错过了一些非常明显的东西。

不仅颜色反转BGRA,而且行也反转 – 图像的底部是内存中的第一个。 这就是Windows一直以来的工作方式。

小端解释似乎很明显,但我认为这不是事实。 如果你看一下Windows API中COLORREF的定义,你会发现Red是低位字节而Blue是高位字节; 如果将其存储为单个整数值,则为RGB0。

ARGB指的是作为单词提取的单词中的字节顺序。 如果您一次获取一个字节,那么您将收到低至hi,因为IBM PC是little-endian