#include "pch.h"
#include < iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef long LONG;
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;//位图信息头
typedef struct tagRGBQUAD { /* rgbq */
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
int main()
{
FILE *fp = NULL;
errno_t err;
err = fopen_s(&fp, "C://VS2017//Tmp//test1//image.raw", "rb");
if (err != 0)
{
return 0;
}
int imageW = 844;//图片格式宽
int imageH = 640;//高
//OpenCV实现
/*
unsigned char* pRawData = (unsigned char*)malloc(imageH * imageW *sizeof(unsigned char));
fread(pRawData, imageH * imageW, 1, fp);
Mat imat(imageH, imageW, CV_8UC1, pRawData);
imwrite("C://H298766//VS2017//Tmp//test1//image.bmp", imat);
free(pRawData);
fclose(fp);
*/
int storeW = imageW;
unsigned char* image = (unsigned char*)malloc(imageH * imageW * sizeof(unsigned char));
fread(image, imageH * imageW, 1, fp);
fclose(fp);
FILE *fp1;
err = fopen_s(&fp1, "C://H298766//VS2017//Tmp//test1//image.bmp", "wb");
if (err != 0) {
return 0;
}
if (storeW % 4 != 0)
{
storeW += (4 - storeW % 4);
}
//生成文件头
BITMAPFILEHEADER fileHeader;
fileHeader.bfType = ((WORD)('M' << 8) | 'B');//0X4d42;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfSize = sizeof(BITMAPFILEHEADER) +sizeof(BITMAPINFOHEADER) + storeW*imageH + sizeof(RGBQUAD) * 256;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;
//生成信息头
BITMAPINFOHEADER bitmapHeader;// = { 0 };
bitmapHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapHeader.biHeight = -imageH;
bitmapHeader.biWidth = imageW;
bitmapHeader.biPlanes = 1;
bitmapHeader.biBitCount = 8;
bitmapHeader.biSizeImage = storeW*imageH;
bitmapHeader.biCompression = 0; //BI_RGB
bitmapHeader.biXPelsPerMeter = 0;//水平分辨率
bitmapHeader.biYPelsPerMeter = 0;//垂直分辨率
bitmapHeader.biClrUsed = 256;//位图实际使用的彩色表中颜色索引数
bitmapHeader.biClrImportant = 0;//对图像显示有重要影响的颜色索引数目,为0表示都重要。
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, fp1);
fwrite(&bitmapHeader, sizeof(BITMAPINFOHEADER), 1, fp1);
RGBQUAD rgb;
rgb.rgbReserved = 0;
for (int i = 0; i < 256; i++)
{
rgb.rgbBlue = rgb.rgbRed = rgb.rgbGreen = i;
fwrite(&rgb, sizeof(RGBQUAD), 1, fp1);
}
fwrite(image, imageH*imageW, 1, fp1);
fclose(fp1);
free(image);
return 0;
}
RAW数据生成BMP图片
最新推荐文章于 2022-08-01 14:45:00 发布