最近要使用代码来生成一个bmp文件,这里简单的笔记下生成一个24位位图最简单代码:
#include <fstream> #include <Windows.h> #include <wingdi.h> int main() { int width = 100; int height = 100; char *pData = (char *)malloc(width * height * 3); /* 填入buffer数据 */ memset(pData, 100, width * height * 3); BITMAPFILEHEADER bmfHdr; RtlZeroMemory(&bmfHdr, sizeof(bmfHdr)); bmfHdr.bfType = 0x4d42;//"BM" bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width * height * 3; bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER bi; RtlZeroMemory(&bi, sizeof(bi)); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biBitCount = 8 * 3; bi.biHeight = height; bi.biWidth = width; bi.biCompression = BI_RGB; bi.biPlanes = 1; std::fstream fout("test.bmp", std::ios::out| std::ios::binary); fout.write((char *)(&bmfHdr), sizeof(bmfHdr)); fout.write((char *)(&bi), sizeof(bi)); fout.write(pData, width * height * 3); fout.flush(); fout.close(); free(pData); return 0; }
可以看到,bmp文件就是一个BITMAPFILEHEADER结构体和一个BITMAPINFOHEADER结构体,然后后面是数据。由于BITMAPFILEHEADER结构体和BITMAPINFOHEADER结构体是固定的,因此,如果我们需要在Linux平台开发或者不想包含头文件的话,可以预先生成一个文件头数据,然后在后面加入对应的数据即可。
发表评论