数字图像处理上机报告

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

相关文档
最新文档