好记性不如铅笔头

C && C++, 编程

使用代码来生成bmp文件

最近要使用代码来生成一个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平台开发或者不想包含头文件的话,可以预先生成一个文件头数据,然后在后面加入对应的数据即可。

发表评论

5 × 3 =

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据