设为首页 加入收藏

TOP

1.4.5 使用ImgCenterDib进行图像可视化编程(2)
2013-10-07 00:21:50 来源: 作者: 【 】 浏览:67
Tags:1.4.5 使用 ImgCenterDib 进行 图像 可视化 编程

1.4.5  使用ImgCenterDib进行图像可视化编程(www.cppentry.com)(2)

(7)加入菜单项“数据访问”,将图像左下角1/4部分置成黑色。此处提供两种位图数据访问及显示效果的方式:一种是在原有位图数据上直接修改并显示修改后的结果,这种方式没有对原始数据保存;另一种是保留原图像,重新创建一个视图窗口,显示改变后的数据,以便于和原图像进行对比。这两种实现方式的代码分别如下:

//该函数是改变原始数据并显示效果的方式
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);
}

chap1_5的运行界面如图1-21所示。图1-22显示了用新建视图的方式进行数据访问的结果。


 
(点击查看大图)图1-21  chap1_5的运行界面
  
(点击查看大图)图1-22  用新建视图的方式显示数据访问的结果

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.4 面向对象的DIB的读写及访问.. 下一篇1.4.5 使用ImgCenterDib进行图像..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: