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); // 原图第一行的数据复制到tmp
memcpy(&(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;
}
}
performance