我新建的MFC项目是dialog based,不是单文档或者多文档,我想再加一个按钮,点击按钮实现用PICture控件显示的图片灰度化,打开和显示已经可以了,用下面的代码实现:
void CTblDlg::OnBtnOpenBmp() 
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,"bmp",".bmp",OFN_HIDEREADONLY,"BMP Files(*.bmp)|*.bmp||");  
    if(dlg.DoModal() != IDOK)  
    {  
return;
}
m_path = dlg.GetPathName(); //获得图片路径
UpdateData(false); //更新路径公共变量
ShowPic();   //调用显示图片函数
}
void CTblDlg::ShowPic() 
{
if(m_path=="")        //判断图片路径是否存在
{
return;
}

hwnd = GetDlgItem(IDC_ShowImg);
hDesDC = hwnd->GetDC()->m_hDC;
hSrcDC = CreateCompatibleDC(hDesDC);
hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hBitmap, sizeof(BITMAP), &bm);
SelectObject(hSrcDC, hBitmap);
hwnd->GetClientRect(&rect);
::SetStretchBltMode(hDesDC,COLORONCOLOR);       
::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);
SetTimer(IDT_TIMER,50,NULL);
UpdateData(false);
}现在如果我想把这幅图灰度化,我应该怎么写代码,怎么获取这幅图片呢?
以前看过MFC多文档下的图片处理程序,什么二值化,滤波,腐蚀,现在就是想转移到对话框形式上,怎么写,各位高手,帮帮忙吧

解决方案 »

  1.   

    你不是获取图像 句柄 hBitmap了么?通过这个句柄锁定内存等  直接操作你的像素就可以进行你想灰度化等操作了,具体的知识参考相关的图像处理书籍。
      

  2.   

    实现图像的预处理,首先你需要提取图像的像素信息
    可以通过定义HBITMAP类型的文件读图
    然后用GetObject和GetBitmapBits函数获取图像的像素信息(即RGB的颜色信息)
    然后依次对每个像素信息进行处理比如说你说的灰度化,每个像素可以用以下公式转换
    gray = (30*R + 59G + 11B + 50)/100;
    如果你的图像是24位图,可以将转换的结果分别赋值给RGB分量,这样就省去了改变图像信息头的麻烦处理完之后再调用SetBitmapBits函数就可以把你通过数组改完的信息输入图像文件另外,你说的二值化等,也都是一个个对图像的每一个像素信息进行处理的,最简单的二值化就是将图像变为黑白图,比如规定大于某个阈值就将该像素置为白色,否则置为黑色。平滑,锐化,膨胀,腐蚀等这些方法主要都是通过模版的卷积运算实现的,你可以查一些资料,只要实现了一种,其他的有模版就也都会了。我上面提到的函数的用法网上都可以查到很具体的,不赘言了。
      

  3.   

    简单方法,
    #include <atlimage.h>
    使用CImage类