2009-02-24 106 views
4

所以,我对刚刚跑过的一个快速测试感到非常困惑。我正在用C#做一些图像处理。 Get/SetPixel()已经证明太慢了,所以我使用LockBits来获取原始数据。为什么我的图像看起来像Bgra而不是Argb格式?

但是,我似乎遇到了我无法弄清楚的情况。在扫描图像时,每个像素似乎按照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; 

其抓住基本图像作品的颜色的第一行,第二不。我很确定,我错过了一些非常明显的东西。

回答

6

不仅颜色颠倒了BGRA,而且行也颠倒了 - 图像的底部是首先在内存中。这正是Windows一直工作的方式。

小端的解释看起来很明显,但我不认为这是事实。如果你看COLORREF in the Windows API的定义,你会注意到红色是低位字节,蓝色是高位;如果您将其存储为单个整数值,则它将是RGB0。

+0

你说得对。这是Windows的事情,不是由于CPU的字节顺序。 – 2009-02-24 19:46:10

6

ARGB引用单词中的字节顺序作为单词提取。如果您一次读取一个字节,您将收到低至高的IBM PC为little-endian

相关问题