数字图像处理上机报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昆明理工大学数字图像处理实验综合报告
学号:
姓名:
指导教师:桂进斌
实验一、bmp位图的读取与显示
一、实验目的:
1、在visual2010下使用C语言编写读取bmp图像数据并显示的对话框。
二、实验原理:
1、bmp图像概述:
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows 环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
2、bmp图像组成:
(1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
(2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
(3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
(4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
三、实验内容以及实验步骤:
1、实验内容:
编写读取bmp图像数据并显示的MFC框架。
2、实验步骤:
(1)生成一名为dip(学生使用自己的名字)的基于MFC的应用程序框架:选择file菜单new选项,在打开的窗口中选择project选项,选中MFC。并在project name输入dip ,选择存放project的位置;(2)在应用程序中加入具体的函数和变量:
a、在CdipView.h中加入如入变量:
public:
int m_x;
HBITMAP m_Bmp;
LPVOID m_ColorList;
LPBYTE m_Image;
LPBITMAPINFOHEADER m_DibHead;
enum allocate {None, crtallocate, heapallocate};
allocate m_nBmpallocate;
allocate m_nImageallocate;
DWORD m_ImageSize;
int m_nPalette;
HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
HGLOBAL m_hGlob;
利用ClassWizard向CdipView类中加入如下成员函数。
void zftjh(unsigned char *lpDib,long lWidth,long lHeight); void SetPaletteSize(int nBitCount);
void Clear();
BOOL ReadFile(CFile *pFile);
BOOL SetPalette();
BOOL GetPalette();
BOOL DibToDC(CDC* pDC,CSize size);
BOOL MemToDib(LPVOID lmem);
CSize GetDibSize();
b、利用资源编辑器,在主菜单中添加消息响应函数OnFileOpen(),具体方法为打开管理窗口,在资源栏中展开资源文件,选择menu并打开,双击“IDR_MAINFRAME”,选择“文件”菜单下“打开”子菜单,右击在快捷菜单中选择“添加事件处理程序”,选择“CDipView 类”,添加消息响应函数,单击“编辑”,并加入如下代码:
CFileDialog filedlg(TRUE,"bmp","*.bmp");
if(filedlg.DoModal()!=IDOK)
return;
CFile myfile;
myfile.Open(filedlg.GetPathName(),CFile::modeRead);
if(ReadFile(&myfile)==TRUE)
Invalidate();
SetPalette();
c、修改OnDraw()函数,添加如下代码:
BeginWaitCursor();
CSize DibSize = GetDibSize();
DibSize.cx *= m_x;
DibSize.cy *= -m_x;
DibToDC(pDC, DibSize);
EndWaitCursor();
d、在CDipView类的构造函数中加入:
m_Image=NULL;
m_DibHead=NULL;
e、在初始化函数OnInitialUpdate()中加入如下代码替换原来的代码:
• m_x=25;
• CSize MaxSize(24000,32000);
• CSize MinSize(MaxSize.cx/100,MaxSize.cy/100);
• SetScrollSizes(MM_HIMETRIC,MaxSize,MaxSize,MinSize);(3)运行程序,观察实验结果。
四、实验结果:
1、程序代码:
int m_x;
HBITMAP m_Bmp;
LPVOID m_ColorList;
LPBYTE m_Image;
LPBITMAPINFOHEADER m_DibHead;
enum allocate {None, crtallocate, heapallocate};
allocate m_nBmpallocate;
allocate m_nImageallocate;
DWORD m_ImageSize;
int m_nPalette;
HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
HGLOBAL m_hGlob;
CSize CDipView::GetDibSize()
{
if(m_DibHead==NULL)
return CSize(0,0);
return CSize((int)m_DibHead->biWidth,(int)m_DibHead->biHeight);
}
BOOL CDipView::MemToDib(LPVOID lmem)
{
Clear();
m_DibHead=(LPBITMAPINFOHEADER)lmem;
SetPaletteSize(m_DibHead->biBitCount);
m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;
GetPalette();
return TRUE;
}
BOOL CDipView::DibToDC(CDC *pDC, CSize size)
{
if(m_DibHead==NULL)
return FALSE;