int lineByte=(bmpWidth*biBitCount/8+3)/4*4这个公式怎么理解

这是计算位图每行占多少个字节;
灰度图像(biBitCount=8)彩色图像(biBitCount=24)
bmpWidth是位图的宽度,也就是每行有多少个像素块
在计算机中如果你是整形 (n)除以(n+i)都是等于0的,(n和i都是自然数)
存储图像数据每行字节数为4的倍数
所以+3是怕出现不满足4的倍数这种情况
如果是4的倍数则结果和不+3的结果是一样的
如果不是4的倍数则结果进1位 



/4*4除以四在乘以四是把数据归为4的倍数。
不够4的倍数就把余数约掉。只留商。
举个例子整形的话17/4=4(正常是4又1/4)而计算机直接算出来等于4
再乘以四就等于16
也就是说把17归为4的倍数=16;
以下是使用MFC库生成BI_RLE8压缩格式的bmp图片的示例代码: ```cpp // 定义BITMAPFILEHEADER结构体 typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为"BM"格式 DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 保留,必须为0 WORD bfReserved2; // 保留,必须为0 DWORD bfOffBits; // 从文件头到位图数据的偏移量,以字节为单位 } BITMAPFILEHEADER; // 定义BITMAPINFO结构体 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 调色板,只有8位图像才有 } BITMAPINFO; // 生成压缩格式为BI_RLE8的bmp图片 void GenerateRLE8Bmp(const CString& bmpFileName, int bmpWidth, int bmpHeight, const BYTE* bmpData) { // 打开文件 CFile bmpFile(bmpFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); // 定义文件头 BITMAPFILEHEADER bmpFileHeader; bmpFileHeader.bfType = 0x4D42; // 位图文件类型 bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + bmpWidth * bmpHeight; // 文件大小 bmpFileHeader.bfReserved1 = 0; bmpFileHeader.bfReserved2 = 0; bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD); // 位图数据偏移量 // 写入文件头 bmpFile.Write(&bmpFileHeader, sizeof(BITMAPFILEHEADER)); // 定义位图信息头 BITMAPINFOHEADER bmpInfoHeader; bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); // 位图信息头大小 bmpInfoHeader.biWidth = bmpWidth; // 位图宽度 bmpInfoHeader.biHeight = bmpHeight; // 位图高度 bmpInfoHeader.biPlanes = 1; // 位图颜色平面数,必须为1 bmpInfoHeader.biBitCount = 8; // 每个像素的位数,必须为8 bmpInfoHeader.biCompression = BI_RLE8; // 压缩类型,必须为BI_RLE8 bmpInfoHeader.biSizeImage = bmpWidth * bmpHeight; // 位图数据大小,以字节为单位 bmpInfoHeader.biXPelsPerMeter = 0; // 水平分辨率,以像素每米为单位 bmpInfoHeader.biYPelsPerMeter = 0; // 垂直分辨率,以像素每米为单位 bmpInfoHeader.biClrUsed = 256; // 颜色表中实际使用的颜色数 bmpInfoHeader.biClrImportant = 0; // 对图像显示有重要影响的颜色数 // 写入位图信息头 bmpFile.Write(&bmpInfoHeader, sizeof(BITMAPINFOHEADER)); // 定义调色板 RGBQUAD bmpColors[256]; for (int i = 0; i < 256; i++) { bmpColors[i].rgbBlue = i; bmpColors[i].rgbGreen = i; bmpColors[i].rgbRed = i; bmpColors[i].rgbReserved = 0; } // 写入调色板 bmpFile.Write(bmpColors, 256 * sizeof(RGBQUAD)); // 定义压缩后的位图数据 BYTE* rle8Data = new BYTE[bmpWidth * bmpHeight]; BYTE* rle8Ptr = rle8Data; for (int i = 0; i < bmpHeight; i++) { BYTE* rowPtr = (BYTE*)bmpData + (bmpHeight - i - 1) * bmpWidth; int rowSize = bmpWidth; while (rowSize > 0) { int count = 1; BYTE color = *rowPtr; rowPtr++; rowSize--; while (rowSize > 0 && count < 255 && *rowPtr == color) { count++; rowPtr++; rowSize--; } *rle8Ptr++ = count; *rle8Ptr++ = color; } *rle8Ptr++ = 0; *rle8Ptr++ = 0; } // 写入位图数据 bmpFile.Write(rle8Data, bmpWidth * bmpHeight); // 关闭文件 bmpFile.Close(); // 释放内存 delete[] rle8Data; } ``` 调用示例: ```cpp // 定义位图数据 const int bmpWidth = 320; const int bmpHeight = 240; BYTE bmpData[bmpWidth * bmpHeight]; memset(bmpData, 0, bmpWidth * bmpHeight); for (int i = 0; i < bmpWidth * bmpHeight; i++) { bmpData[i] = rand() % 256; } // 生成压缩格式为BI_RLE8的bmp图片 GenerateRLE8Bmp(_T("test.bmp"), bmpWidth, bmpHeight, bmpData); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值