Почему мои изображения выглядят в формате Bgra, а не в формате Argb?

Итак, я очень смущен быстрым тестом, который я только что провел. Я занимаюсь обработкой изображений на C#. Get / SetPixel () оказался слишком медленным, поэтому я использую LockBits для получения необработанных данных.

Однако, похоже, я попал в ситуацию, которую не могу понять. При сканировании изображения кажется, что каждый пиксель представлен как Bgra, то есть синий байт, зеленый байт, красный байт и альфа-канал в указанном порядке. У меня создалось впечатление, что они будут выложены в порядке 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)

Решение

Не только цвета BGRA меняются местами, но и строки также меняются местами - нижняя часть изображения является первой в памяти. Windows всегда так работала.

Объяснение с прямым порядком байтов кажется очевидным, но я не думаю, что это правда. Если вы посмотрите на определение COLORREF в Windows API , вы заметите, что красный - это младший байт, а синий - более высокий; если вы сохранили это как одно целое значение, это будет RGB0.

ARGB относится к порядку байтов в словах, извлеченных как слова. Если вы извлекаете байты по одному, вы получите em low to hi, поскольку IBM PC имеет обратный порядок байтов.