模拟BITMAPFILEHEADER、BITMAPINFOHEADER结构体实现文件头写入。如果需要wchar支持,更改fopen为_wfopen即可。 bool bmp565_write(unsigned char *image, long width, long height, const char *filename) { long file_size; long data_size; unsigned char widthAlignBytes; FILE *fp; // 文件头 unsigned char header[66] = { // BITMAPFILEINFO 'B', 'M', // [0-1] bfType:必须是BM字符 0, 0, 0, 0, // [2-5] bfSize:总文件大小 0, 0, 0, 0, // [6-9] brReserved1,bfReserved2:保留 sizeof(header), 0, 0, 0,// [10-13] bfOffBits:到图像数据的偏移 // BITMAPFILEHEADER 0x28, 0, 0, 0, // [14-17] biSize:BITMAPINFOHEADER大小40字节 0, 0, 0, 0, // [18-21] biWidth:图片宽度 0, 0, 0, 0, // [22-25] biHeight:图片高度 0x01, 0, // [26-27] biPlanes:必须为1 0x10, 0, // [28-29] biBitCount:16位 0x03, 0, 0, 0, // [30-33] biCompression:BI_BITFIELDS=3 0, 0, 0, 0, // [34-37] biSizeImage:图片大小 0x12, 0x0B, 0, 0, // [38-41] biXPelsPerMeter:单位长度内的像素数 0x12, 0x0B, 0, 0, // [42-45] biYPelsPerMeter:单位长度内的像素数 0, 0, 0, 0, // [46-49] biClrUsed:可用像素数,设为0即可 0, 0, 0, 0, // [50-53] biClrImportant:重要颜色数,设为0即可 // RGBQUAD MASK 0x0, 0xF8, 0, 0, // [54-57] 红色掩码 0xE0, 0x07, 0, 0, // [58-61] 绿色掩码 0x1F, 0, 0, 0 // [62-65] 蓝色掩码 }; widthAlignBytes = ((width * 16 + 31) & ~31) / 8; // 每行需要的合适字节个数 data_size = widthAlignBytes * height; // 图像数据大小 file_size = data_size + sizeof(header); // 整个文件的大小 *((long*)(header + 2)) = file_size; *((long*)(header + 18)) = width; *((long*)(header + 22)) = height; *((long*)(header + 34)) = data_size; if (!(fp = fopen(filename, "wb"))) return false; fwrite(header, sizeof(unsigned char), sizeof(header), fp); if (widthAlignBytes == width * 2) { fwrite(image, sizeof(unsigned char), (size_t)data_size, fp); } else { // 每一行单独写入 const static DWORD DWZERO = 0; for (int i = 0; i < height; i++) { fwrite(image + i * width * 2, sizeof(unsigned char), (size_t) width * 2, fp); fwrite(&DWZERO, sizeof(unsigned char), widthAlignBytes - width * 2, fp); } } fclose(fp); return true; } 里面的具体结构体使用方法请参考MSDN