CImage類提供了GetBits()函數來讀取數據區,GetBits()函數返回的是圖片最后一行第一個像素的地址,
網上有人說返回指針的起始位置是不同的,有些圖片返回的是左上角像素的地址,有些是左下角像素的地址,跟圖片內部順序有關。
GetPitch( ) 圖像的間距。 如果返回值為負,位圖是一個從下到上 DIB,並且原點是左下角。 如果返回值為正的,位圖是一組 DIB,並且原點為左上角
兩個函數GetPitch()和GetHeight()一起使用就可以得到圖片數據取得起始位置
img_Data=(BYTE *)m_Image.GetBits()+(m_Image.GetPitch()*(m_Image.GetHeight()-1));
這樣,img_Data就是圖片數據區的起始位置,這個公式是從codeproject里看到的,介紹的很精辟,可以從google里搜索到。
其中GetHeight()函數返回圖片的高度(以像素為單位)。GetPitch()返回圖像的斜度,如果圖像的順序是從下到上(也就是GetBits()返回左上角像素的地址),
這時GetPitch()返回一個負值,大小為圖像寬所占有的字節數,例如24位800*600的圖片,返回值應該是正或負的800*3。
這樣用每一行的字節數乘行數就可以得到起始位置了。
函數getbits(x,p,n),返回x中從右邊數第p位開始向右數n位的字段。
這里假設最右邊的一位是第0位,n與p都是合理的正值。
例如getbits(x,4,3)返回x中的第4、3、2三位的值。
下面給出通過位運算的實現方法:
unsigned getbits(unsigned x,int p,int n) { return (x>>(p+1-n))&~(~0<<n); }
其中,表達式x>>(p+1-n)將期望獲得的字段移動到字的最右端,~0的所有位都為1,
這里使用語句~0<<n將~0左移n位,並將最右邊的n位用0填補。再使用~運算符對它
按位取反,這樣就建立了最右邊n位全為1的屏蔽碼。