2009-02-24 105 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

相關問題