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];
			}

改后图像正常显示了:



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