code
void BGR24ToBMP(const int width, const int height, uint8_t *framedata, const char *outfile)
{BITMAPFILEHEADER bmp_header; // 声明BMP文件的头结构BITMAPINFOHEADER bmp_info; // 声明BMP文件的信息结构unsigned int data_size = (width * 3 + 3) / 4 * 4 * height;FILE *fp = fopen(outfile, "wb");if (!fp){return;}// 文件标识填BM(0x4D42)表示位图bmp_header.bfType = 0x4D42;// 保留字段1。填0即可bmp_header.bfReserved1 = 0;// 保留字段2。填0即可bmp_header.bfReserved2 = 0;// 从文件开头到位图数据的偏移量(单位为字节)bmp_header.bfOffBits = sizeof(bmp_header) + sizeof(bmp_info);// 整个文件的大小(单位为字节)bmp_header.bfSize = bmp_header.bfOffBits + data_size;// 信息头的长度(单位为字节)bmp_info.biSize = sizeof(bmp_info);// 位图宽度(单位为像素)bmp_info.biWidth = width;// 位图高度(单位为像素)。若为正,则表示倒向的位图;若为负,则表示正向的位图bmp_info.biHeight = height;// 位图的面数。填1即可bmp_info.biPlanes = 1;// 单个像素的位数(单位为比特)。RGB各1字节,总共3字节,也就是24位bmp_info.biBitCount = 24;// 压缩说明。0(BI_RGB)表示不压缩bmp_info.biCompression = 0;// 位图数据的大小(单位为字节)bmp_info.biSizeImage = data_size;// 水平打印分辨率(单位为像素/米)。填0即可bmp_info.biXPelsPerMeter = 0;// 垂直打印分辨率(单位为像素/米)。填0即可bmp_info.biYPelsPerMeter = 0;// 位图使用的颜色掩码。填0即可bmp_info.biClrUsed = 0;// 重要的颜色个数。都是普通颜色,填0即可bmp_info.biClrImportant = 0;fwrite(&bmp_header, sizeof(bmp_header), 1, fp); // 写入BMP文件头fwrite(&bmp_info, sizeof(bmp_info), 1, fp); // 写入BMP信息头uint8_t tmp[width * 3]; // 临时数据// 把缓冲区的图像数据倒置过来for (int i = 0; i < height / 2; i++){memcpy(tmp, &(framedata[width * i * 3]), width * 3); // 原图第一行的数据复制到tmpmemcpy(&(framedata[width * i * 3]),&(framedata[width * (height - 1 - i) * 3]), width * 3); // 原图最后一行的数据复制到第一行memcpy(&(framedata[width * (height - 1 - i) * 3]), tmp, width * 3); // 原图第一行的数据复制到最后一行}fwrite(framedata, width * height * 3, 1, fp); // 写入图像数据if (fp){fclose(fp);fp = nullptr;}
}