代码之家  ›  专栏  ›  技术社区  ›  Ed Swangren

为什么我的图像似乎是bgra格式而不是argb?

  •  4
  • Ed Swangren  · 技术社区  · 16 年前

    所以,我对我刚参加的快速测试感到非常困惑。我正在用C做一些图像处理。get/setpixel()被证明速度太慢,所以我使用锁位来获取原始数据。

    然而,我似乎遇到了一个我无法理解的情况。扫描图像时,每一个像素似乎都以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;
    

    获取基础图像颜色的第一行有效,而第二行无效。我很肯定我错过了一些显而易见的东西。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Mark Ransom    16 年前

    不仅颜色颠倒了BGRA,而且行也颠倒了——图像的底部是内存中的第一个。这就是窗户一直工作的方式。

    结尾的解释似乎很明显,但我不认为这是事实。如果你看一下 COLORREF in the Windows API ,您会注意到红色是低阶字节,蓝色是高阶字节;如果您将其存储为单个整数值,它将是rgb0。

        2
  •  6
  •   Scott Evernden    16 年前

    argb是指作为单词提取的单词中的字节顺序。如果您一次取一个字节,您将像IBM PC那样从低到高接收它们。 little-endian

    推荐文章