我的图片为什么似乎在BGRA而不是ARGB格式?
-
06-09-2019 - |
题
所以,我是一个简短的测试,我只是跑很困惑。我在C#中做一些图像处理。获取/ 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;
,其抓住基本图像作品的颜色的第一行,第二不。我敢肯定,我失去了一些东西很明显这里。
解决方案
不仅是颜色反转BGRA,但是行被反转,以及 - 图像的底部是在存储器中的第一个。这只是了Windows一贯努力。
在little-endian的解释似乎很明显,但我不认为这是事实。如果你看一下在Windows API中的COLORREF的定义一>,你会发现,红色是低位字节和蓝色是高阶;如果存储在此作为一个整数值,这将是RGB0。
其他提示
ARGB指词语取出作为字的字节顺序。如果你在一个时间内获取的字节之一,您会收到EM从低到喜如IBM PC的是的小端
不隶属于 StackOverflow