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