实验二编写图像读写程序剖析

上传人:今*** 文档编号:105924020 上传时间:2019-10-14 格式:DOC 页数:7 大小:1,011KB
返回 下载 相关 举报
实验二编写图像读写程序剖析_第1页
第1页 / 共7页
实验二编写图像读写程序剖析_第2页
第2页 / 共7页
实验二编写图像读写程序剖析_第3页
第3页 / 共7页
实验二编写图像读写程序剖析_第4页
第4页 / 共7页
实验二编写图像读写程序剖析_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《实验二编写图像读写程序剖析》由会员分享,可在线阅读,更多相关《实验二编写图像读写程序剖析(7页珍藏版)》请在金锄头文库上搜索。

1、实 验 二【实验名称】编写图像读/写程序【实验内容】用VC+或C#等实现无格式(. RAW)及位图(. BMP)的显示、读文件、另存文件及相互转换格式,界面设计可参考Photoshop的界面。实验使用的操作系统是Windows XP,使用的软件是Visual C+ 6.0。 思想:打开文件,根据文件后缀名,判断如何显示图像,保存时根据选择做对应的格式转换。主要解决的问题:如何读取位图文件(*.bmp)、如何读取无格式文件(*.raw)、如何将无格式文件(*.raw)转换成位图文件(*.bmp)及如何将图像保存为位图文件(*.bmp)文件。【实验步骤】1. 在VC 6.0 MFC下,创建基于单文

2、档的工程Image;2. 在ImageView类中添加显示、保存图像文件所需的变量如下: BITMAP Bitmap;CString pathname;BYTE Gray;CImageApp *app;int m_nColorUse; / 实际用到的颜色数(也即颜色表数组的大小)LONG m_nDataSize;RGBQUAD* m_pColorTable; / 颜色表LONG m_nWidth; / 位图宽度LONG m_nHeight; / 位图高度int m_flag; / 图像类型标记BITMAPINFOHEADER m_bmih; / 位图信息头BITMAPFILEHEADER m_

3、bmfh; / 位图文件头 unsigned char * m_pImage; / 位图数据指针3. 在ImageView类中添加相关的图像文件操作函数:OnFileOpen(),OnFileSaveAs(),OnFileSave(),OnPaint()。 OnFileOpen()函数功能是在打开图像文件时记录文件类型(RAW/BMP)及文件头等相关信息,然后通过OnPaint()函数做出相关判断,显示相应的图像文件。OnFileSaveAs()和OnFileSave()实现相同的功能,都是对打开的图像文件进行保存,同时可以实现RAW和BMP格式的相互转换。【实验结果】打开并显示文件:保存文件

4、(格式转换)及转换后的文件显示:【结果分析与比较】本实验成功实现了RAW格式和BMP格式图像文件的显示和格式转换。无格式文件(*.raw),就是指没有文件头信息,所有的字节都是用来表示各像素点的颜色信息,按从左到右、从上到下的顺序排列。位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列。通过格式转换前后文件的对比,明显位图文件比无格式文件占用的空间要大,质量相对比无格式的要好。通过这次实验,使我对这两种格式的图像文件有了深入认识,并对其存储格式有

5、了更深一步的学习,能够认识到不同格式文件之间的异同,也为以后进行更深一步的图像处理奠定了一定的基础。【参考文献】1. 杨淑莹编著,VC+图像处理程序设计(第二版),清华大学出版社,20052. 赵辉, 叶子青编著,Visual C+系统开发实例精粹,人民邮电出版社,2005 3. 谭明金编著,Visual C+图形编程技巧与实例,人民邮电出版社,20024. 霍宏涛编著,数字图像处理,北京理工大学出版社,20025. 马平编著,数字图像处理和压缩,电子工业出版社,2007【附件】主要功能函数代码如下:void CImageView:OnFileOpen() CFileDialogdlg(TRU

6、E,NULL,NULL,NULL,BMP(*.BMP)|*.bmp|RAW(*.RAW)| *.raw| |, this);if(dlg.DoModal()=IDOK)CString str; / 存贮扩展名str=dlg.GetFileExt(); / 获得文件扩展名/ 如果是RAW格式的图像,则以下打开处理if(str=RAW)|(str=raw)CFile rawfile;rawfile.Open(dlg.GetPathName(),CFile:modeRead); / 打开文件m_nDataSize=rawfile.GetLength(); / 获取文件长度m_pImage=new u

7、nsigned charm_nDataSize; / 分配数据内存rawfile.ReadHuge(m_pImage,m_nDataSize); / 读取文件rawfile.Close();m_nWidth=(LONG)sqrt(m_nDataSize);m_nHeight=m_nWidth;m_flag=1; / RAW格式的图像标记/ 如果是.BMP格式的图像,则以下打开方式else if(str=BMP)|(str=bmp)CFile bmpfile;if(!bmpfile.Open(dlg.GetPathName(),CFile:modeRead) / 判断文件打开return ;Ze

8、roMemory(&m_bmfh,sizeof(BITMAPFILEHEADER);bmpfile.Read(&m_bmfh,sizeof(BITMAPFILEHEADER);/ 读取文件头ZeroMemory(&m_bmih,sizeof(BITMAPINFOHEADER);bmpfile.Read(&m_bmih,sizeof(BITMAPINFOHEADER); / 读取信息头m_nColorUse=m_bmih.biClrUsed; / 实际用到的颜色if(m_nColorUse=0)switch(m_bmih.biBitCount)case 1:m_nColorUse=2;break

9、;case 4:m_nColorUse=16;break;case 8:m_nColorUse=256;break;default:break;m_pColorTable=new RGBQUADm_nColorUse; / 分配颜色表的内存bmpfile.Read(m_pColorTable,m_nColorUse*sizeof(RGBQUAD); / 读取颜色数入颜色表中m_nHeight=m_bmih.biHeight; / 图像数据高度m_nWidth=m_bmih.biWidth; / 图像数据高度m_nDataSize=WIDTHBYTES(m_nWidth*m_bmih.biBit

10、Count)*m_nHeight;/后图像大小m_pImage=new unsigned charm_nDataSize; / 分配数据内存bmpfile.ReadHuge(m_pImage,m_nDataSize); / 读取图像数据bmpfile.Close();pathname=dlg.GetPathName();m_flag=2; / BMP格式的图像标记 isload=1; / 直方图用到Invalidate();void CImageView:OnFileSaveAs() CFileDialog filedlg(FALSE,*.RAW|*.raw|*.BMP|*.bmp,NULL,

11、OFN_HIDEREAD ONLY | OFN_OVERWRITEPROMPT, *.RAW|*.raw|*.BMP|*.bmp|,NULL);if(filedlg.DoModal()=IDOK)CString str; / 存贮扩展名str=filedlg.GetFileExt(); / 取得扩展名/ 储存为raw图像if(str=RAW)|(str=raw)CFile rawfile;/ 如果打开的是raw图像,则下列存贮方法if(m_flag=1)if(!rawfile.Open(filedlg.GetFileName(),CFile:modeCreate|CFile:modeWrite

12、)return;rawfile.WriteHuge(LPVOID)m_pImage,m_nDataSize);rawfile.Close();/ 如果打开的是bmp图像,则下列存贮方法else if(m_flag=2)if(!rawfile.Open(filedlg.GetFileName(),CFile:modeCreate|CFile:modeWrite)return;unsigned char* temp;LONG i,j; / 循环变量DWORD LineBytes;LineBytes=WIDTHBYTES(m_nWidth*m_bmih.biBitCount);/ 因为raw图像从上

13、到下显示,而bmp图像是从下到上存贮道的, 所以要从最后一行开始读取它的数据并存贮为raw图像for(i=m_nHeight-1;i=0;i-)for(j=0;j=m_nWidth-1;j+)temp=(m_pImage+i*LineBytes+j);rawfile.WriteHuge(temp,1);rawfile.Close();/ 储存bmp图像else if(str=BMP)|(str=bmp)CFile bmpfile; if(!bmpfile.Open(filedlg.GetPathName(),CFile:modeCreate|CFile:modeWrite)return;bmpfile.Write(&m_bmfh,sizeof(BITMAPFILEHEADER);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号