本文共 1391 字,大约阅读时间需要 4 分钟。
转自:
做图像处理时,有时需要临时生成图使用。以下是生成320x240 24位图的一个简单的代码实现:#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8) void makebmp(){int nSize =abs(long(240 * WIDTHBYTES(24 * 320)));char* buff = new char[nSize];memset(buff, 0, nSize);BITMAPINFOHEADER header;header.biSize = sizeof(BITMAPINFOHEADER);header.biWidth = 320;header.biHeight = 240*(-1);header.biBitCount = 24;header.biCompression = 0;header.biSizeImage = 0;header.biClrImportant = 0;header.biClrUsed = 0;header.biXPelsPerMeter = 0;header.biYPelsPerMeter = 0;header.biPlanes = 1;//3 构造文件BITMAPFILEHEADER bmpFileHeader;HANDLE hFile = NULL;DWORD dwTotalWriten = 0;DWORD dwWriten;bmpFileHeader.bfType = 0x4d42; //'BM';bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ nSize;FILE* pf = fopen("d:\\test.bmp", "wb");fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, pf);fwrite(&header, sizeof(BITMAPINFOHEADER), 1, pf);fwrite(buff, 1, nSize, pf);fclose(pf);delete buff;}唯一需要解释的就是这句:#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)这是为了保证32字节对齐。VC的头文件和DirectShow的文件都能找到定义。因为 memset(buff, 0, nSize);所以生成的图是黑色的。可以自己修改,按RGB三字节写上不同的值,看看图像有什么变化。