#include <Windows.h>
#pragma warning(disable: 4996)
int main(void)
{
BITMAPFILEHEADER fileheader; // 位图文件头
BITMAPINFOHEADER infoheader; // 位图信息
BYTE bits[100][452]; // 实际位图数据, 第一维为高度, 第二维为宽度乘每像素的字节数, 第二维必须是4的倍数
// 这里位图的宽度为150, 因为150*3=450, 450不是4的倍数, 比450大且离450最近的4的倍数是452, 所以第二维为452
FILE *fp = fopen("image.bmp", "wb");
if (fp == NULL)
return 1;
/* 写入位图文件头信息 */
fileheader.bfType = *(PWORD)"BM"; // 文件类型, 必须为BM
fileheader.bfSize = sizeof(fileheader) + sizeof(infoheader) + sizeof(bits); // 位图总大小
fileheader.bfReserved1 = fileheader.bfReserved2 = 0; // 保留字节
fileheader.bfOffBits = sizeof(fileheader) + sizeof(infoheader); // 文件开头到位图数据的距离
fwrite(&fileheader, sizeof(fileheader), 1, fp);
/* 写入位图信息 */
infoheader.biSize = sizeof(infoheader); // 本结构体的大小
infoheader.biWidth = 150; // 位图的宽度
infoheader.biHeight = 100; // 位图的高度 (正数: 位图数据从底到顶; 负数: 位图数据从底到顶)
infoheader.biPlanes = 1; // 目标设备的平面数 (必须为1)
infoheader.biBitCount = 24; // 每个像素的颜色用24位, 即3字节表示
infoheader.biCompression = BI_RGB; // 压缩方式
infoheader.biSizeImage = 0; // 位图数据的大小 (BI_RGB类型的位图可设为0)
infoheader.biXPelsPerMeter = infoheader.biYPelsPerMeter = 0; // 位图水平、垂直分辨率, 单位: 像素/米
infoheader.biClrUsed = 0; // 位图实际使用的颜色表中的颜色数, 0表示使用了所有颜色
infoheader.biClrImportant = 0; // 为了显示该位图必须要用到的颜色数, 0表示所有颜色都用到了
fwrite(&infoheader, sizeof(BITMAPINFOHEADER), 1, fp);
/* 写入图像数据 */
memset(bits, 0, sizeof(bits));
bits[0][2] = 0xff;
bits[0][4] = 0xff;
bits[0][6] = 0xff;
bits[1][0] = bits[1][1] = bits[1][2] = 0xee;
fwrite(bits, sizeof(bits), 1, fp);
fclose(fp);
return 0;
}
所创建的位图:

左下角:
