RAW数据生成BMP图片

#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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值