关于bitmap每行字节数的问题
我在 何斌 的 VISUAL C++数字图像处理 中第二章有个疑问:
*******************************
biSizeImage = biWidth' * biHeight
这里的biWidth'是大于或等于离4最近的整倍数,如biWidth = 241,那么biWidth' = 244.
在构建自己的DIB时#define WIDTHBYTES(bits) = (((bits) + 31)/32*4)
这里的bits为:BITMAPINFOHEADER里的biWidth.
最后数据大小直接为WIDTHBYTES(biWidth)*(biBitCount)*BiHeight
******************
其中一段源程序为
**********************
// 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并
// 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。
// 文件头大小+颜色表大小
// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
dwDIBSize = *(LPDWORD)lpBI + ::PaletteSize((LPSTR)lpBI);
// 计算图像大小
if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
{
// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值
dwDIBSize += lpBI->biSizeImage;
}
else
{
// 象素的大小
DWORD dwBmBitsSize;
// 大小为Width * Height
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
// 计算出DIB真正的大小
dwDIBSize += dwBmBitsSize;
// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
lpBI->biSizeImage = dwBmBitsSize;
}
// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
***************************************
我想问:
① biWidth = 241 指的是像素数目还是字节数目,应该是字节数吧?
②#define WIDTHBYTES(bits) = (((bits) + 31)/32*4)中后面bits应该单位为像素,前面求得的结果应该直接变成了字节吧?
③// 大小为Width * Height
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
其中dwBmBitsSize的单位是字节,而lpBI->biHeight的单位是像素,WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI-> biBitCount)) 的单位是字节,怎么能直接相加呢?
④ 在一个帖子中看到bitmap每行字节数DataSizePerLine= (biWidth* biBitCount+31)/8; 这个和WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) 求得的结果是一致的么?我算时遇到了整除的问题就是后面的乘法不能移到整除号的前面,不知道如何求证是一致的?