数字图像处理实验三中值滤波和均值滤波实验报告_第1页
数字图像处理实验三中值滤波和均值滤波实验报告_第2页
数字图像处理实验三中值滤波和均值滤波实验报告_第3页
数字图像处理实验三中值滤波和均值滤波实验报告_第4页
数字图像处理实验三中值滤波和均值滤波实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-z.数字图像处理实验三均值滤波、中值滤波的计算机实现12281166雪莹计科1202班一、实验目的:1〕熟悉均值滤波、中值滤波处理的理论根底;2〕掌握均值滤波、中值滤波的计算机实现方法;3〕学习VC++6。0的编程方法;4〕验证均值滤波、中值滤波处理理论;5〕观察均值滤波、中值滤波处理的结果。二、实验的软、硬件平台:硬件:微型图像处理系统,包括:主机,PC机;摄像机;软件:操作系统:WINDOWS2000或WINDOWS*P应用软件:VC++6.0三、实验容:1〕握高级语言编程技术;2〕编制均值滤波、中值滤波处理程序的方法;3〕编译并生成可执行文件;4〕考察处理结果。四、实验要求:1〕学习VC++确6。0编程的步骤及流程;2〕编写均值滤波、中值滤波的程序;3〕编译并改错;4〕把该程序嵌入试验二给出的界面中〔作适当修改〕;5〕提交程序及文档;6〕写出本次实验的体会。五、实验结果截图实验均值滤波采用的是3*3的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。六、实验体会本次实验在前一次的实验根底上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。七、实验程序代码注释及分析//HistDemoADlg.h:头文件//#include"ImageWnd.h"#pragmaonce//CHistDemoADlg对话框classCHistDemoADlg:publicCDialogE*{//构造public: CHistDemoADlg(CWnd*pParent=NULL); //标准构造函数intnWidth; intnHeight; intnLen; intnByteWidth; BYTE*lpBackup; BYTE*lpBitmap; BYTE*lpBits; CStringFileName; CImageWndsource,dest;//对话框数据enum{IDD=IDD_HISTDEMOA_DIALOG}; protected: virtualvoidDoDataE*change(CDataE*change*pD*); //DD*/DDV支持//实现protected: HICONm_hIcon; //生成的消息映射函数virtualBOOLOnInitDialog(); af*_msgvoidOnSysmand(UINTnID,LPARAMlParam); af*_msgvoidOnPaint(); af*_msgHCURSOROnQueryDragIcon(); DECLARE_MESSAGE_MAP()public: voidLoadBitmap(void); af*_msgvoidOnOpen(); af*_msgvoidOnHist(); voidHistogramEq(void); voidNoColor(void); voidHistogramEq1(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput); voidMeanFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput); voidMedianFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput); af*_msgvoidOnBnClickedClose(); af*_msgvoidOnBnClickedMeanfilter(); af*_msgvoidOnBnClickedMedianfilter();};HistDemoADlg.cpp对HistDemoADlg.h进展具体的实现,OnOpen()函数响应ID为IDC_OPEN的按钮事件,而且会调取文件选择对话框,选取文件之后,会显示在原始图像区域显示对应的位图图像,OnHist()函数会响应ID为IDC_HIST的按钮事件,调用HistogramEq()进展直方图均衡化的处理,HistogramEq()会调用HistogramEq1()进展直方图均衡化的处理,并用dst.setImage()显示处理之后的图像,以及NoColor()函数,对原始图像转化为灰度图像之后再显示。//HistDemoADlg.cpp:实现文件//#include"stdaf*.h"#include"HistDemoA.h"#include"HistDemoADlg.h"#include"af*dialoge*.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif#definePoint(*,y)lpPoints[(*)+(y)*nWidth]#definePoint1(*,y)lpPoints1[(*)+(y)*nWidth]//用于应用程序“关于〞菜单项的CAboutDlg对话框classCAboutDlg:publicCDialogE*{public: CAboutDlg();//对话框数据enum{IDD=IDD_ABOUTBO*}; protected: virtualvoidDoDataE*change(CDataE*change*pD*);//DD*/DDV支持//实现protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogE*(CAboutDlg::IDD){}voidCAboutDlg::DoDataE*change(CDataE*change*pD*){ CDialogE*::DoDataE*change(pD*);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogE*)END_MESSAGE_MAP()//CHistDemoADlg对话框CHistDemoADlg::CHistDemoADlg(CWnd*pParent/*=NULL*/) :CDialogE*(CHistDemoADlg::IDD,pParent){ m_hIcon=Af*GetApp()->LoadIcon(IDR_MAINFRAME); lpBitmap=0; lpBackup=0;}voidCHistDemoADlg::DoDataE*change(CDataE*change*pD*){ CDialogE*::DoDataE*change(pD*);}BEGIN_MESSAGE_MAP(CHistDemoADlg,CDialogE*) ON_WM_SYSMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_OPEN,&CHistDemoADlg::OnOpen) ON_BN_CLICKED(IDC_HIST,&CHistDemoADlg::OnHist) ON_BN_CLICKED(IDCLOSE,&CHistDemoADlg::OnBnClickedClose) ON_BN_CLICKED(IDC_MEANFILTER,&CHistDemoADlg::OnBnClickedMeanfilter) ON_BN_CLICKED(IDC_MEDIANFILTER,&CHistDemoADlg::OnBnClickedMedianfilter)END_MESSAGE_MAP()//CHistDemoADlg消息处理程序BOOLCHistDemoADlg::OnInitDialog(){ CDialogE*::OnInitDialog(); //将“关于...〞菜单项添加到系统菜单中。//IDM_ABOUTBO*必须在系统命令围。ASSERT((IDM_ABOUTBO*&0*FFF0)==IDM_ABOUTBO*); ASSERT(IDM_ABOUTBO*<0*F000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { BOOLbNameValid; CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBO*); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBO*,strAboutMenu); } } //设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE); //设置大图标SetIcon(m_hIcon,FALSE); //设置小图标//TODO:在此添加额外的初始化代码source.Create(0,L"Source",WS_CHILD|WS_VISIBLE,CRect(40,40,360,280),this,10000); dest.Create(0,L"Destination",WS_CHILD|WS_VISIBLE,CRect(400,40,720,280),this,10001); returnTRUE;//除非将焦点设置到控件,否则返回TRUE}voidCHistDemoADlg::OnSysmand(UINTnID,LPARAMlParam){ if((nID&0*FFF0)==IDM_ABOUTBO*) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialogE*::OnSysmand(nID,lParam); }}//如果向对话框添加最小化按钮,则需要下面的代码//来绘制该图标。对于使用文档/视图模型的MFC应用程序,//这将由框架自动完成。voidCHistDemoADlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使图标在工作区矩形中居中intc*Icon=GetSystemMetrics(SM_C*ICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); int*=(rect.Width()-c*Icon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //绘制图标dc.DrawIcon(*,y,m_hIcon); } else { CDialogE*::OnPaint(); }}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSORCHistDemoADlg::OnQueryDragIcon(){ returnstatic_cast<HCURSOR>(m_hIcon);}voidCHistDemoADlg::LoadBitmap(){ //位图文件:BITMAPFILEHEADER+BITMAPINFOHEADER+有效信息局部BITMAPINFOHEADER*pInfo;//位图文件的头部信息指针pInfo pInfo=(BITMAPINFOHEADER*)(lpBitmap+sizeof(BITMAPFILEHEADER));//pInfo指向位图文件的头部信息nWidth=pInfo->biWidth;//图片宽度nByteWidth=nWidth*3;//字节宽度if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);//使字节宽度为4的整数倍nHeight=pInfo->biHeight; //图片高度if(pInfo->biBitCount!=24)//位图的位深度不为24 { if(pInfo->biBitCount!=8)//位深度不为8 { Af*MessageBo*(L"无效位图"); deletelpBitmap; lpBitmap=0; return; } //位深度为8 unsignedintPaletteSize=1<<pInfo->biBitCount;//左移8位,PaletteSize调色板尺寸if(pInfo->biClrUsed!=0&&pInfo->biClrUsed<PaletteSize)PaletteSize=pInfo->biClrUsed;//biClrUsed位图实际使用的颜色表中的颜色数lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//lpBits指向有效信息局部RGBQUAD*pPalette=(RGBQUAD*)lpBits;//颜色表局部/* typedefstructtagRGBQUAD{ BYTErgbBlue; BYTErgbGreen; BYTErgbRed; BYTErgbReserved; }RGBQUAD; */ lpBits+=sizeof(RGBQUAD)*PaletteSize;//lpBits指向图像有效信息局部nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight;//整个位图文件的长度BYTE*lpTemp=lpBitmap; lpBitmap=newBYTE[nLen]; BITMAPFILEHEADERbmh; BITMAPINFOHEADERbmi; bmh.bfType='B'+'M'*256; bmh.bfSize=nLen; bmh.bfReserved1=0; bmh.bfReserved2=0; bmh.bfOffBits=54; bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth=nWidth; bmi.biHeight=nHeight; bmi.biPlanes=1; bmi.biBitCount=24; bmi.bipression=BI_RGB; bmi.biSizeImage=0; bmi.bi*PelsPerMeter=0; bmi.biYPelsPerMeter=0; bmi.biClrUsed=0; bmi.biClrImportant=0; intnBWidth=pInfo->biWidth; if(nBWidth%4)nBWidth+=4-(nBWidth%4); memset(lpBitmap,0,nLen); memcpy(lpBitmap,&bmh,sizeof(BITMAPFILEHEADER));//位图文件头部memcpy(lpBitmap+sizeof(BITMAPFILEHEADER),&bmi,sizeof(BITMAPINFOHEADER));//位图信息头部BYTE*lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//位图图像信息局部int*,y,p1,p2,Palette; for(y=0;y<nHeight;y++) { for(*=0;*<nWidth;*++) { p1=y*nBWidth+*; p2=y*nByteWidth+**3; if(lpBits[p1]<PaletteSize)Palette=lpBits[p1]; elsePalette=0; lpBits2[p2]=pPalette[Palette].rgbBlue; lpBits2[p2+1]=pPalette[Palette].rgbGreen; lpBits2[p2+2]=pPalette[Palette].rgbRed; } } deletelpTemp; } lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); if(lpBackup)deletelpBackup; lpBackup=newBYTE[nLen]; memcpy(lpBackup,lpBitmap,nLen);}voidCHistDemoADlg::OnOpen()//点击翻开文件之后,对应的事件处理函数{//TODO:在此添加控件通知处理程序代码CFileFile; CFileDialogdlg(TRUE,0,0,OFN_HIDEREADONLY,L"位图文件|*.bmp|所有文件|*.*||",this);//新建文件选择对话框if(dlg.DoModal()==IDOK) { FileName=dlg.GetPathName();//得到文件的路径if(!File.Open(FileName,CFile::modeRead))return;//以只读方式翻开文件//TODO:addloadingcodehere if(lpBitmap)deletelpBitmap; //保证lpBitmap为空nLen=(int)File.GetLength();//得到文件的长度lpBitmap=newBYTE[nLen]; //为lpBitmap分配空间File.Read(lpBitmap,nLen); //将文件的容读入到lpBitmap所指向的存区域LoadBitmap(); //调用LoadBitmap(),加载位图图像if(lpBitmap)source.SetImage(nWidth,nHeight,lpBits); }}voidCHistDemoADlg::OnHist(){ //TODO:在此添加控件通知处理程序代码HistogramEq();}voidGetPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints){ int*,y,p; intnByteWidth=nWidth*3; if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4); for(y=0;y<nHeight;y++)//每一行 {for(*=0;*<nWidth;*++)//每一列 {p=**3+y*nByteWidth; lpPoints[*+y*nWidth]=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);//三种颜色的比例计算对应点的颜色值,并且强制转换成BYTE } }}voidPutPoints(intnWidth,intnHeight,BYTE*lpBits,BYTE*lpPoints)//逐个对lpBits进展赋值{intnByteWidth=nWidth*3; if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4); int*,y,p,p1;for(y=0;y<nHeight;y++)//每一行 {for(*=0;*<nWidth;*++)//每一列 {p=**3+y*nByteWidth; p1=*+y*nWidth; lpBits[p]=lpPoints[p1]; lpBits[p+1]=lpPoints[p1]; lpBits[p+2]=lpPoints[p1]; } }}voidCHistDemoADlg::HistogramEq(void){ if(lpBitmap==0)return; BYTE*lpOutput=newBYTE[nByteWidth*nHeight]; HistogramEq1(nWidth,nHeight,lpBits,lpOutput); dest.SetImage(nWidth,nHeight,lpOutput);//在直方图均衡化的区域显示结果deletelpOutput; NoColor();//将原始图像转换成灰度图像}voidCHistDemoADlg::NoColor(){ if(lpBitmap==0)return; int*,y,p; BYTEPoint; for(y=0;y<nHeight;y++)//每一行 {for(*=0;*<nWidth;*++)//每一列 {p=**3+y*nByteWidth; Point=(BYTE)(0.299*(float)lpBits[p+2]+0.587*(float)lpBits[p+1]+0.114*(float)lpBits[p]+0.1);//计算颜色值,在0-255的灰度级之间lpBits[p+2]=Point; lpBits[p+1]=Point; lpBits[p]=Point; } } source.SetImage(nWidth,nHeight,lpBits);//将彩色图像转化成灰度图像}voidCHistDemoADlg::HistogramEq1(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput){ int*,y; BYTE*lpPoints=newBYTE[nWidth*nHeight];//像素点的个数GetPoints(nWidth,nHeight,lpInput,lpPoints);//lpPoints存的是颜色值intr[256],s[256];//颜色值数组,统计对应颜色值像素点的个数ZeroMemory(r,1024); ZeroMemory(s,1024); for(y=0;y<nHeight;y++){//统计对应颜色值像素点的个数,Point(*,y)是lpPoints〔*,y〕for(*=0;*<nWidth;*++){ r[Point(*,y)]++; } } s[0]=r[0]; for(y=1;y<256;y++) { s[y]=s[y-1]; s[y]+=r[y]; }//计算颜色值的前y种颜色的总像素点的个数〔像素点颜色值<=y〕for(y=0;y<nHeight;y++){//将计算对应点的像素值,直方图均匀化的结果保存在lpPoints for(*=0;*<nWidth;*++){ Point(*,y)=s[Point(*,y)]*255/nWidth/nHeight; } } PutPoints(nWidth,nHeight,lpOutput,lpPoints);//输出lpPoints到lpOutput deletelpPoints;}voidCHistDemoADlg::OnBnClickedClose(){ //TODO:在此添加控件通知处理程序代码//E*itProcess(0);//注意使用时先释放分配的存,以免造成存泄露//e*it(0);//正常终止程序;e*it(非0〕非正常终止程序PostQuitMessage(0);//最常用}voidCHistDemoADlg::OnBnClickedMeanfilter(){ //TODO:在此添加控件通知处理程序代码if(lpBitmap==0)return; BYTE*lpOutput=newBYTE[nByteWidth*nHeight]; MeanFilter(nWidth,nHeight,lpBits,lpOutput); dest.SetImage(nWidth,nHeight,lpOutput);//在直方图均衡化的区域显示结果deletelpOutput; NoColor();//将原始图像转换成灰度图像}voidCHistDemoADlg::MeanFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput){ int*,y; BYTE*lpPoints=newBYTE[nWidth*nHeight];//像素点的个数BYTE*lpPoints1=newBYTE[(nWidth+2)*(nHeight+2)]; GetPoints(nWidth,nHeight,lpInput,lpPoints);//lpPoints存的是颜色值for(y=1;y<nHeight+1;y++){//中间最整块图像的拷贝for(*=1;*<nWidth;*++){ Point1(*,y)=Point(*-1,y-1); //lpPoints1[y][*]=lpPoints[y-1][*-1]; } } for(y=1;y<nHeight+1;y++){//最左边和最右边一列的拷贝Point1(0,y)=Point(0,y-1); Point1(nWidth+1,y)=Point(nWidth-1,y-1); //lpPoints1[y][0]=lpPoints[y-1][0]; //lpPoints1[y][nWidth+1]=lpPoints[y-1][nWidth-1]; } for(*=0;*<nWidth+2;*++){//最上边和最下边一行的拷贝Point1(*,0)=Point1(*,1); Point1(*,nHeight+1)=Point1(*,nHeight); //lpPoints1[0][*]=lpPoints1[1][*]; //lpPoints1[nHeight+1][*]=lpPoints1[nHeight][*]; } for(y=0;y<nHeight;y++){//求以*点为中心的九个数平均值for(*=0;*<nWidth;*++){ Point(*,y)=(Point1(*,y)+Point1(*+1,y)+Point1(*+2,y)+ Point1(*,y+1)+Point1(*+1,y+1)+Point1(*+2,y+1)+ Point1(*,y+2)+Point1(*+1,y+2)+Point1(*+2,y+2))/9; /* lpPoints[y][*]=(lpPoints1[y][*]+lpPoints1[y][*+1]+lpPoints1[y][*+2]+ lpPoints1[y+1][*]+lpPoints1[y+1][*+1]+lpPoints1[y+1][*+2]+ lpPoints1[y+2][*]+lpPoints1[y+2][*+1]+lpPoints1[y+2][*+2])/9; */ } } PutPoints(nWidth,nHeight,lpOutput,lpPoints);//输出lpPoints到lpOutput deletelpPoints;}voidCHistDemoADlg::MedianFilter(intnWidth,intnHeight,BYTE*lpInput,BYTE*lpOutput){ int*,y; BYTE*lpPoints=newBYTE[nWidth*nHeight];//像素点的个数BYTE*lpPoints1=newBYTE[(nWidth+2)*(nHeight+2)]; GetPoints(nWidth,nHeight,lpInput,lpPoints);//lpPoints存的是颜色值for(y=1;y<nHeight+1;y++){//中间一整块拷贝for(*=1;*<nWidth;*++){ Point1(*,y)=Point(*-1,y-1); } } for(y=1;y<nHeight+1;y++){//最左边和最右边一列的拷贝Point1(0,y)=Point(0,y-1); Point1(nWidth+1,y)=Point(nWidth-1,y-1); } for(*=0;*<nWidth+2;*++){//最上边和最下边一行的拷贝Point1(*,0)=Point1(*,1); Point1(*,nHeight+1)=Point1(*,nHeight); } BYTE*window=newBYTE[9]; for(y=0;y<nHeight;y++){ for(*=0;*<nWidth;*++){ intk=0; for(inti=y;i<=y+2;i++){ for(intj=*;j<=*+2;j++){ if(k<9) window[k++]=Point1(j,i); } } for(intm=0;m<5;++m)//求9个数的中值,window[4]为中值 { intmin=m; for(intn=m+1;n<9;++n) if(window[n]<window[min]) min=n; //Putfoundminimumelementinitsplace BYTEtemp=window[m]; window[m]=window[min]; window[min]=temp; } Point(*,y)=window[4]; } } PutPoints(nWidth,nHeight,lpOutput,lpPoints);//输出lpPoints到lpOutput deletelpPoints;}voidCHistDemoADlg::OnBnClickedMedianfilter(){ //TODO:在此添加控件通知处理程序代码if(lpBitmap==0)return; BYTE*lpOutput=newBYTE[nByteWidth*nHeight]; MedianFilter(nWidth,nHeight,lpBits,lpOutput); dest.SetImage(nWidth,nHeight,lpOutput);//在中值滤波的区域显示结果deletelpOutput; NoColor();//将原始图像转换成灰度图像}CImageWnd.h类继承自CWnd主要是图像显示方面的函数,如水平滚轮和垂直滚轮的事件函数,以及绘制函数OnPaint(),初始化函数等等,以及存放需要绘制的图像信息的成员变量。setImage(),外接提供绘制的信息,通过参数传递给部的成员变量。#pragmaonceclassCImageWnd:publicCWnd{public: intHCurrentPosition;//当前位置〔水平〕intHScrollMa*; //滑动最大位置〔水平〕intHScrollPosition; //滑动位置〔水平〕intVCurrentPosition;//当前位置〔垂直〕intVScrollMa*;//滑动最大位置〔垂直〕intVScrollPosition;//滑动位置〔垂直〕intnWidth; //宽度intnHeight; //高度intnByteWidth; //字节宽度BYTE*lpBits; //指向字节的指针public: CImageWnd(void); ~CImageWnd(void); voidSetImage(intc*,intcy,constvoid*bits); voidSetScroll(intc*,intcy);protected: af*_msgBOOLOnEraseBkgnd(CDC*pDC); af*_msgvoidOnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); af*_msgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); af*_msgvoidOnPaint(); af*_msgintOnCreate(LPCREATESTRUCTlpCreateStruct); DECLARE_MESSAGE_MAP()/*protected: //{{AF*_MSG(CImageWnd) af*_msgBOOLOnEraseBkgnd(CDC*pDC); af*_msgvoidOnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); af*_msgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar); af*_msgvoidOnPaint(); af*_msgintOnCreate(LPCREATESTRUCTlpCreateStruct); //}}AF*_MSG DECLARE_MESSAGE_MAP()*/};ImageWnd.cpp具体实现ImageWnd.h的一些功能函数,注释已经给出,在此不再赘述。#include"StdAf*.h"#include"ImageWnd.h"#defineBACKGROUNDRGB(128,128,128)CImageWnd::CImageWnd(void)//初始化,将其全设为0{ HScrollPosition=0; HCurrentPosition=0; HScrollMa*=0; VScrollPosition=0; VCurrentPosition=0; VScrollMa*=0; lpBits=0;}CImageWnd::~CImageWnd(void)//析构函数,释放空间{if(lpBits)deletelpBits;}BEGIN_MESSAGE_MAP(CImageWnd,CWnd) //{{AF*_MSG_MAP(CImageWnd) ON_WM_ERASEBKGND() ON_WM_HSCROLL() ON_WM_VSCROLL() ON_WM_PAINT() ON_WM_CREATE() //}}AF*_MSG_MAPEND_MESSAGE_MAP()BOOLCImageWnd::OnEraseBkgnd(CDC*pDC)//设置背风光,320,240{ if(!lpBits)pDC->FillSolidRect(0,0,320,240,BACKGROUND); returnTRUE;}voidCImageWnd::OnPaint()//绘制函数,每次需要显示的图像发生变化,就会重画,重复调用这个函数进展重画{CPaintDCdc(this);//当前对象作为参数if(lpBits) { int*,y; *=-HScrollPosition; y=-VScrollPosition; if(nWidth<320)*=(320-nWidth)/2; if(nHeight<240)y=(240-nHeight)/2; //设置绘制位图文件的头信息BITMAPINFOHEADERbmi; bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth=nWidth; bmi.biHeight=nHeight; bmi.biPlanes=1; bmi.biBitCount=24; bmi.bipression=BI_RGB; bmi.biSizeImage=0; bmi.bi*PelsPerMeter=0; bmi.biYPelsPerMeter=0; bmi.biClrUsed=0; bmi.biClrImportant=0; //将像素点填充到绘图区域StretchDIBits(dc.m_hDC,*,y,nWidth,nHeight,0,0,nWidth,nHeight,lpBits,(BITMAPINFO*)&bmi,DIB_RGB_COLORS,SRCCOPY); }}voidCImageWnd::OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)//水平滚轮事件处理函数,{switch(nSBCode) { caseSB_LINEDOWN://每次滑动的间隔为5个像素点HScrollPosition+=5; break; caseSB_LINEUP: HScrollPosition-=5; break; caseSB_PAGEDOWN://滑到最底端HScrollPosition+=320; break; caseSB_PAGEUP://滑到最顶端HScrollPosition-=320; break; caseSB_THUMBPOSITION: caseSB_THUMBTRACK: HScrollPosition=nPos; break; } if(HScrollPosition<0)HScrollPosition=0;//滑动位置小于0,设为0 if(HScrollPosition>HScrollMa*)HScrollPosition=HScrollMa*;//滑动位置大于最大值,设为最大值SetScrollPos(SB_HORZ,HScrollPosition);//水平方向滑动距离if(HCurrentPosition!=HScrollPosition)//HCurrentPosition和HScrollPosition不相等就滑动 {ScrollWindow(HCurrentPo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论