【问题标题】:Why do my images seem to be in the format of Bgra instead of Argb?为什么我的图像似乎是 Bgra 而不是 Argb 格式?
【发布时间】:2010-10-09 12:03:24
【问题描述】:

所以,我对刚刚运行的快速测试感到非常困惑。我正在用 C# 进行一些图像处理。 Get/SetPixel() 被证明太慢了,所以我使用 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;

获取基本图像颜色的第一行有效,第二行无效。我很确定我在这里遗漏了一些非常明显的东西。

【问题讨论】:

    标签: c# image-processing lockbits


    【解决方案1】:

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

    little-endian 的解释似乎很明显,但我认为这不是事实。如果您查看COLORREF in the Windows API 的定义,您会注意到Red 是低位字节,Blue 是高位字节;如果将其存储为单个整数值,则为 RGB0。

    【讨论】:

    • 你是对的。这是 Windows 的事情,不是因为 CPU 的字节序。
    【解决方案2】:

    ARGB 指的是作为字提取的字中的字节顺序。如果您一次获取一个字节,您将收到 em low to hi 因为 IBM PC 是 little-endian

    【讨论】:

      猜你喜欢
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2014-01-27
      • 2014-02-02
      相关资源
      最近更新 更多