数字图像处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字图像处理

实习报告

专业:遥感科学与技术专业

班级:

学号:

姓名:

实习一:将RAW图像格式转换成BMP图像格式

实习目的:

熟悉常用的图像文件格式,了解各个图像格式的特点,掌握RAW和BMP文件格式的存储和读取,编程实现RA W到BMP格式的转换,为读取各种格式的图像文件打基础。

实习原理和方法:

RA W格式图像将像素按行列号顺序存储在文件中。这种文件只含有图像像素数据,不含有信息头,在读图像时,需要事先知道图像大小,是一种最简单的图像文件格式。

BMP格式文件分成位图文件头,位图信息头,调色板,图像数据四个部分。

因此,将RAW格式转换成BMP格式,首先要创建位图文件头和信息头(八位位图以下要建颜色表),再读取图像的数据,写入文件中。最后将图像显示出来。

实习步骤:

根据自己的学号新建一个多文档项目;

在框架中添加CDIB类,以实现BMP图像的读取操作;

添加菜单项“格式转换”,弹出格式转换对话框,以输入RAW格式图像路径,对应的存储BMP格式图像路径,以及输出图像的高度和宽度。

对菜单项建立消息响应函数ONRaw()进行读图像,文件头信息头颜色表赋值,再存图像;

void CMy200332590083View::OnRawToBmp()

{

// TODO: Add your command handler code here

CRawToBmpDlg brdlg;

if(brdlg.DoModal()==IDOK)

{

CFile FileRaw;

FileRaw.Open(brdlg.m_open,CFile::modeRead);

LONG Length=FileRaw.GetLength();

HLOCAL hRaw=LocalAlloc(LHND,Length);

LPBYTE pRaw=(LPBYTE)Local Lock(hRaw);

FileRaw.ReadHuge(pRaw,Length);

//写文件头赋值

int nLineBytes = (brdlg.m_width*8+31)/32*4;

BITMAPFILEHEADER BmpFileHeader;

BmpFileHeader.bfType =0x4d42;

BmpFileHeader.bfSize =14+40+sizeof(RGBQUAD)*256+nLineBytes*brdlg.m_height;

BmpFileHeader.bfOffBits =14+40+sizeof(RGBQUAD)*256;

BmpFileHeader.bfReserved1 =0;

BmpFileHeader.bfReserved2 =0;

//写位图信息头

BITMAPINFOHEADER BmpInfoHeader;

BmpInfoHeader.biBitCount =8;

BmpInfoHeader.biClrImportant=0;

BmpInfoHeader.biClrUsed =0;

BmpInfoHeader.biCompression =BI_RGB;

BmpInfoHeader.biHeight =brdlg.m_height;

BmpInfoHeader.biWidth =brdlg.m_width;

BmpInfoHeader.biPlanes =1;

BmpInfoHeader.biSize =40;

BmpInfoHeader.biXPelsPerMeter=0;

BmpInfoHeader.biYPelsPerMeter=0;

BmpInfoHeader.biSizeImage =nLineBytes*brdlg.m_height;

//24//8

//写调色板

RGBQUAD rgb[256];

for(int i=0;i<256;i++)

{

rgb[i].rgbBlue =i;

rgb[i].rgbRed =i;

rgb[i].rgbGreen =i;

rgb[i].rgbReserved=0;

}

//写数据

LPBYTE Data,begin;

Data = new BYTE[nLineBytes*brdlg.m_height];

begin=Data;

LPBYTE pEnd,Mid;

pEnd = pRaw +Length;

for(int j=0;j

{

pEnd = pEnd - brdlg.m_width;

Mid = pEnd;

for(int k=0;k

{

*Data= *Mid;

Data++;

Mid++;

}

for(int m=brdlg.m_width;m

{

*Data = 0;

Data++;

}

}

//写入文件

CString FileName;

HANDLE hFilebmp = ::CreateFile(brdlg.m_save,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,

CREA TE_ALW AYS,FILE_A TTRIBUTE_NORMAL,NULL);

if(hFilebmp == NULL)

{

AfxMessageBox("无法创建文件.",0,0);

CloseHandle(hFilebmp);

hFilebmp = NULL;

}

unsigned long WriteNum;

//写入数据

WriteFile(hFilebmp,&BmpFileHeader,sizeof(BITMAPFILEHEADER),&WriteNum,NULL);//文件头if(WriteNum != (unsigned long)sizeof(BITMAPFILEHEADER))

return ;

WriteFile(hFilebmp,&BmpInfoHeader,sizeof(BITMAPINFOHEADER),&WriteNum,NULL);//信息头if(WriteNum != (unsigned long)sizeof(BITMAPINFOHEADER))

return;

WriteFile(hFilebmp,rgb,sizeof(RGBQUAD)*256,&WriteNum,NULL);//调色板

if(WriteNum != (unsigned long)(sizeof(RGBQUAD)*256))

return;

WriteFile(hFilebmp,begin,(nLineBytes*brdlg.m_height),&WriteNum,NULL);//数据

if(WriteNum != (unsigned long)(nLineBytes*brdlg.m_height))

return ;

CloseHandle(hFilebmp);

}

}

相关文档
最新文档