windows DIB位圖的4字節對齊

       昨天做一些對位圖的處理,需要對像素進行一些複製操作,結果發現在處理部分圖像的時候,顯示的圖像是斜向左錯位顯示的,如下圖所示。經過多次對不同的圖像進行顯示,發現對於那些圖像寬度爲單數的圖像都出現斜向左錯位顯示的現象。

原圖(295X338):                                                                     顯示後的圖像(錯位了):

      


       查了一些資料後才知道,windows DIB位圖的每一行都是4字節對齊的,也就是說,圖像的像素寬度不一定就是圖像實際數據的一行中的字節的數目(對於8位位圖而言),因而在複製數據的時候一定要注意,需要使用圖像實際數據的一行的字節數,而不是圖像的寬度。對於一些圖像寬度正好是4的倍數的時候則不會出項這個問題,但是爲了處理各種尺寸的圖像,都有必要對這個問題進行處理。

一行數據的字節數的計算方法:

int iLineBytes = (pixels_width * biBitCount / 8 +3) / 4 *4

我出問題的代碼:

//爲分配的內存初始化
		for(unsigned int i = 0 ; i < m_PtrCoding->ImageRows ; i ++)
			for(unsigned int j = 0 ; j < m_PtrCoding->ImageWidth ; j ++)
			{
				m_pImgData[i][j] = (int)m_pImg->imageData[i * m_pImg->width + j];
			}
修改後的代碼:

//位圖的寬度並不是位圖實際存儲空間的寬度,位圖是4字節對齊的,所以一行數據的寬度不一定等於位圖的寬度
		int iLineByte = (m_pImg->width * m_pImg->depth / 8 + 3) / 4 * 4;
		//爲分配的內存初始化
		for(unsigned int i = 0 ; i < m_PtrCoding->ImageRows ; i ++)
			for(unsigned int j = 0 ; j < m_PtrCoding->ImageWidth ; j ++)
			{
				m_pImgData[i][j] = (int)m_pImg->imageData[i * /*m_pImg->width*/iLineByte + j];
			}

改後圖像正常顯示了:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章