数字图像处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); } }