我新建的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多文档下的图片处理程序,什么二值化,滤波,腐蚀,现在就是想转移到对话框形式上,怎么写,各位高手,帮帮忙吧
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多文档下的图片处理程序,什么二值化,滤波,腐蚀,现在就是想转移到对话框形式上,怎么写,各位高手,帮帮忙吧
可以通过定义HBITMAP类型的文件读图
然后用GetObject和GetBitmapBits函数获取图像的像素信息(即RGB的颜色信息)
然后依次对每个像素信息进行处理比如说你说的灰度化,每个像素可以用以下公式转换
gray = (30*R + 59G + 11B + 50)/100;
如果你的图像是24位图,可以将转换的结果分别赋值给RGB分量,这样就省去了改变图像信息头的麻烦处理完之后再调用SetBitmapBits函数就可以把你通过数组改完的信息输入图像文件另外,你说的二值化等,也都是一个个对图像的每一个像素信息进行处理的,最简单的二值化就是将图像变为黑白图,比如规定大于某个阈值就将该像素置为白色,否则置为黑色。平滑,锐化,膨胀,腐蚀等这些方法主要都是通过模版的卷积运算实现的,你可以查一些资料,只要实现了一种,其他的有模版就也都会了。我上面提到的函数的用法网上都可以查到很具体的,不赘言了。
#include <atlimage.h>
使用CImage类