//该函数是改变原始数据并显示效果的方式 void CChap1_5View::OnDataAccess1() {
//获取文档类指针 CChap1_5Doc *pDoc=GetDocument();
//获取ImgCenterDib类对象的指针,访问打开文件的数据 ImgCenterDib *pDib=pDoc->GetPDib();
//位图数据的指针 unsigned char *imgData=pDib->m_pImgData;
//位图阵列的大小 CSize imgSize=pDib->GetDimensions();
//每像素的位数 int nBitCount=pDib->m_nBitCount;
//循环变量,图像坐标 int i,j;
//每像素占字节数 int bytePerPixel=nBitCount/8;
//每行像素所占字节数,必须是4的倍数 int lineByte=(imgSize.cx*nBitCount/8+3)/4*4;
//循环变量,每像素各字节(分量)访问的循环变量 int k;
//将图像左下角1/4部分置黑色 for(i=0;i<imgSize.cy/2;i++){ for(j=0;j<imgSize.cx/2;j++){ for(k=0;k<bytePerPixel;k++){ *(imgData+i*lineByte+j*bytePerPixel+k)=0; } } }
//刷新显示 Invalidate(); } //该函数是保留原始图像数据,重建新的视图显示数据改变后的结果 void CChap1_5View::OnDataAccess2() { //获取文档类指针 CChap1_5Doc *pDoc=GetDocument();
//获取ImgCenterDib类对象的指针,访问打开文件的数据 ImgCenterDib *pDib=pDoc->GetPDib();
//位图数据的指针 unsigned char *imgData=pDib->m_pImgData;
//位图阵列的大小 CSize imgSize=pDib->GetDimensions();
//每像素的位数 int nBitCount=pDib->m_nBitCount; //每像素占字节数 int bytePerPixel=nBitCount/8;
//每行像素所占字节数,必须是4的倍数 int lineByte=(imgSize.cx*nBitCount/8+3)/4*4; //申请缓冲区pBuf unsigned char* pBuf=new unsigned char[lineByte*imgSize.cy]; //将原DIB位图数据拷贝至pBuf memcpy(pBuf, imgData, lineByte*imgSize.cy);
//循环变量,图像坐标 int i,j; //循环变量,每像素各字节(分量)访问的循环变量 int k;
//将pBuf左下角1/4部分置黑色 for(i=0;i<imgSize.cy/2;i++){ for(j=0;j<imgSize.cx/2;j++){ for(k=0;k<bytePerPixel;k++){ *(pBuf+i*lineByte+j*bytePerPixel+k)=0; } } }
//打开新视图,显示分割结果 CMainFrame* pFrame = (CMainFrame *) (AfxGetApp()->m_pMainWnd); //发送一个新建文件的消息,创建一个新的文档-视图 pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW); //获取新建视图指针 CChap1_5View* pView=(CChap1_5View*)pFrame-> MDIGetActive()->GetActiveView(); //获取相关联的新的文档类指针 CChap1_5Doc* pDocNew=pView->GetDocument(); //获取新文档中的ImgCenterDib类对象指针 ImgCenterDib *dibNew=pDocNew->GetPDib();
//调用ReplaceDib,用改变以后的位图数据替换原位图 dibNew->ReplaceDib(imgSize,nBitCount, pDib->m_lpColorTable, pBuf); //设置滚动窗口 pView->OnInitialUpdate(); //文档数据置脏,提示存盘信息 pDocNew->SetModifiedFlag(TRUE); //各视图刷新显示 pDocNew->UpdateAllViews(pView); } |