Почему мои изображения выглядят в формате Bgra вместо Argb? - PullRequest
4 голосов
/ 24 февраля 2009

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

Однако, похоже, я попал в ситуацию, которую не могу понять. При сканировании изображения кажется, что каждый пиксель представлен в виде Bgra, то есть синий байт, зеленый байт, красный байт и альфа, в этом порядке. У меня сложилось впечатление, что они будут выложены в порядке Аргг. Вот пример кода, который я использую.

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 ]

6 голосов
/ 24 февраля 2009

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

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

6 голосов
/ 24 февраля 2009

ARGB относится к порядку байтов в словах, выбранных как слова. Если вы выбираете байты по одному, вы получите их от низкого до высокого, поскольку IBM PC имеют little-endian

...