生成一个空白BMP的简单代码【转】
转自:http://blog.chinaunix.net/uid-15063109-id-4275395.html
做图像处理时,有时需要临时生成图使用。以下是生成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三字节写上不同的值,看看图像有什么变化。
【作者】sky
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.