MFC和Gdi+实现图片雾化

1.创建一个基于对话框的程序

2.添加对Gdi+的支持

3.在对话框类中添加公有成员

Gdiplus::Bitmap *m_IamgeShow;
Gdiplus::RectF m_rect;
void ImageAtomization(Gdiplus::Bitmap *pImage);
CString m_FileName;
在Initstance()函数中初始化
m_ImageShow=NULL;
m_FileName=_T("");
CRect rc;
GetClientRect(&rc);
m_rect.X=rc.left;
m_rect.Y=rc.top;
m_rect.Width=rc.Width();
m_rect.Height=rc.Height();

3.接下来我们编写雾化操作的具体代码

void CMFCApplication1Dlg::ImageAtomization(Gdiplus::Bitmap *pImage)
{
int width=m_rect.Width;
int height=m_recr.Height;
for(int x=1;x<width;x++)
   for(int y=1;y<height;y++)
  {
  Color color;
  double f=RAND_MAX;
  int k=(int)(24*rand()/f);
  dx=x+k%15;
  dy=y+k%15;
  if(dx>width)
   dx=width-1;
  if(dy>height)
   dy=height-1;
pImage->GetPixel(x,y,&color);
PImage->SetPixel(dx,dy,color);
  }
}
4.接下来我们添加鼠标左键单击消息和计时器消息
void CMFCApplication1Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_ImageShow == NULL)
	{
		MessageBox(_T("没有图像文件是不能执行此项操作的!"), _T("信息提示"), MB_OK);
		return;
	}
	
	this->DiffuseImage(m_ImageShow);
	
	CDialogEx::OnLButtonDown(nFlags, point);
}


void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	HDC hdc = ::GetDC(GetSafeHwnd());
	CDC m_dcMemory;
	CDC* dc = CClientDC::FromHandle(hdc);
	m_dcMemory.CreateCompatibleDC(dc);
	CRect rc;
	GetClientRect(&rc);
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(dc, rc.Width(), rc.Height());
	CBitmap *pOldbmp=m_dcMemory.SelectObject(&bmp);
	Graphics gh(m_dcMemory.GetSafeHdc());
	gh.Clear(Color(128, 128, 12));

	gh.DrawImage(m_ImageShow, 0,0, rc.Width(), rc.Height());

	::BitBlt(hdc,0, 0, rc.Width(), rc.Height(),m_dcMemory.GetSafeHdc(), 0, 0, SRCCOPY);

	dc->DeleteDC();
	m_dcMemory.SelectObject(pOldbmp);
	DeleteObject(bmp);
	ReleaseDC(&m_dcMemory);

	CDialogEx::OnTimer(nIDEvent);
}

在Initstance函数中添加
SetTimer(1,100,NULL);

5,将对话框 确定按钮标题修改为"打开”ID为ID_OPEN
添加事件处理
void CMFCApplication1Dlg::OnBnClickedFileOpen()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFilter = _T("All Files(*.*)|*.*|");
	//打开文件对话框
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, strFilter);
	int hResult = (int)dlg.DoModal();
	if (hResult != IDOK)
	{
		return;
	}
	m_StrImageFileName.Format(dlg.GetPathName());
	//装入图像文件
	m_ImageShow = NULL;
	m_ImageShow = Bitmap::FromFile(m_StrImageFileName);
	if (!m_ImageShow)
	{
		MessageBox(_T("装入图像操作失败"), _T("错误信息提示"), MB_OK);
		return;
	}
}

效果





猜你喜欢

转载自blog.csdn.net/qq_33012981/article/details/80729446
今日推荐