#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;
}
所創建的位圖:

左下角:
