C++ 读取raw文件并保存为到bmp图片下

   上篇文章,写了如何读取光谱图片raw,本文就解决,如何把保存的像素值保存为BMP图片格式。

   关于bmp文件格式,网上有很多,不再赘述。我们需要做的只是修改相关信息头,然后填充数据就可以了,本代码实现的是24真彩色显示,即不带调色板,R,G,B三个分量都显示同一波段的像素值。这个可以得到一个波段的图像。调整相关系数,就可以得到16个波段的图像。做这个,主要还是为了以后图像处理可以更方便的看到结果。

   代码如下:

/* 读取RAW图像*/
#include 
#include 
#include 
#include "string.h"
#define  samples  512
#define  lines    256
#define  bands    16

typedef  unsigned char  BYTE;

/*写入bmp图像*/
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;//位图信息头

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);
  
} 

int main()
{
	FILE *fp  = NULL;
    static	BYTE raw_all[samples*lines*bands*2];
    static	BYTE raw_data[samples*lines*bands];//定义为全局变量,防止出现局部变量过大产生bug
	BYTE *ptr;

	if((fp = fopen("D:\\cube\\prefix_0.raw","rb"))==NULL)
	{
		printf("can not open the raw image");
		return 0;
	}
	else
	{
		printf("read OK\n");
	}

	printf("begin read\n");
	ptr = (BYTE*)malloc(samples*lines*bands*sizeof(BYTE)*2);
	for(int i=0;i
结果如下: C++ 读取raw文件并保存为到bmp图片下_第1张图片


你可能感兴趣的:(C++ 读取raw文件并保存为到bmp图片下)