【C++】Raw格式数据转换成Bmp图片
一.位图结构体
Raw格式数据一般是记录了摄像头或者照相机传感器的原始信息,属于未加工过的原始图像文件,而Bmp格式数据一般有指定格式的文件头以及信息头,所以转换的时候需要添加位图的文件头以及信息头,定义的结构体如下:
typedef struct {WORD bfType;//文件类型,必须是0x424D,即字符“BM” DWORD bfSize;//文件大小 WORD bfReserved1;//保留字 WORD bfReserved2;//保留字 DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
} BITMAPFILEHEADER;//位图文件头typedef struct {DWORD biSize;//信息头大小 LONG biWidth;//图像宽度 LONG biHeight;//图像高度 WORD biPlanes;//位平面数,必须为1 WORD biBitCount;//每像素位数 DWORD biCompression;//压缩类型 DWORD biSizeImage;//压缩图像大小字节数 LONG biXPelsPerMeter;//水平分辨率 LONG biYPelsPerMeter;//垂直分辨率 DWORD biClrUsed;//位图实际用到的色彩数 DWORD biClrImportant;//本位图中重要的色彩数
}BITMAPINFOHEADER;//位图信息头
二.生成位图
void saveBITmap(int simple, int line, unsigned char *pData, char* filename)
{const int height = line;const int width = simple;long int size = height * width * 3;//double x,y;//生成文件头BITMAPFILEHEADER fileHeader;fileHeader.bfType = 0X4d42;fileHeader.bfReserved1 = 0;fileHeader.bfReserved2 = 0;fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + size;fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//生成信息头BITMAPINFOHEADER bitmapHeader = { 0 };bitmapHeader.biSize = sizeof(BITMAPINFOHEADER);bitmapHeader.biHeight = -height;bitmapHeader.biWidth = width;bitmapHeader.biPlanes = 1;bitmapHeader.biBitCount = 24;bitmapHeader.biSizeImage = size;bitmapHeader.biCompression = 0; //BI_RGB //保存数据FILE *fp2 = fopen(filename, "wb");if (!fp2) {return;}fwrite(&fileHeader, 1, sizeof(BITMAPFILEHEADER), fp2);fwrite(&bitmapHeader, 1, sizeof(BITMAPINFOHEADER), fp2);fwrite(pData, 1, size, fp2);fclose(fp2);}
三.主函数编写
FILE *fp = NULL;static BYTE raw_all[samples*lines*bands * 2];static BYTE raw_data[samples*lines*bands];//定义为全局变量,防止出现局部变量过大产生bugBYTE *ptr;if ((fp = fopen("XXX.raw", "rb")) == NULL)return 0;ptr = (BYTE*)malloc(samples*lines*bands*sizeof(BYTE) * 2);for (int i = 0; i
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
