【MFC】CImage类的简单应用

CImage类的介绍与使用

   CImage类是ATL和MFC共用的一个类,其头文件为atlimage.h,主要用于图片文件的打开,显示与保存。这里需要注意的是,在VS2010和VS2012的MFC编程中,不需要将头文件包含进来。MFC中要使用CImage类,必须先将头文件包含进来,可以包含在当前代码的CPP文件中,也可以包含在所属类的头文件中,不过最好还是包含在工程的stdafx.h文件中。CImage总共有39个成员函数。具体函数介绍,请查阅MSDN。

彩色图像转换成8位灰度图像

将一张普通彩色图像转换成8位灰度图像,需要调用灰度图像的调色板来处理,且需要调用CImage::IsIndexed来判断是否使用颜色表,若是则修改颜色表,否则直接对像素对颜色值进行处理。

void CImageDlg::TurnToGray(CImage *img,CImage *newimg)
{
	int width=img->GetWidth();
	int height=img->GetHeight();
	COLORREF pixel;
	RGBQUAD ColorTable[256];

	for (int i = 0; i < 256; ++i)
	{
		ColorTable[i].rgbBlue = ColorTable[i].rgbGreen = ColorTable[i].rgbRed = i;
	}

	newimg->SetColorTable(0, 256, ColorTable);
	byte* pDataDst = (byte*)newimg->GetBits();
	int pitchDst = newimg->GetPitch();
	int bitCountDst = newimg->GetBPP() / 8;

	if (bitCountDst != 1)
		return;
	int r,g,b,avg;

	for(int i=0;i<width;i++)
	{
		for(int j=0;j<height;j++)
		{
			pixel=img->GetPixel(i,j);
			r=GetRValue(pixel);
			g=GetGValue(pixel);
			b=GetBValue(pixel);
			avg=(r+g+b)/3;
		*(pDataDst+pitchDst*j+i*bitCountDst)=avg;
		}
	}
}

MFC对话框显示图像
void CImageDlg::ShowImage(CImage image,int id)  
{   //一个参数是对象srcPng或者是destPng,另一个参数是控件ID
	hdc = ::GetDC(GetDlgItem(id)->GetSafeHwnd());
	GetDlgItem(id)->GetClientRect(rect);
	image.Draw(hdc , rect);
	::DeleteDC(hdc);
}
打开一张图像并显示
void CEx_ImageView::OnFileOpen() //Cyan:添加
{
     // TODO: 在此添加命令处理程序代码
     CString strFilter;
     CSimpleArray<GUID>aguidFileTypes;
     HRESULT hResult;   //获取CImage支持的图像文件的过滤字符串
     hResult=m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T("All Image Files"));
     if(FAILED(hResult))
     {
         MessageBox(_T("GetExporterFilter调用失败!"));
         return;
     }
     CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter);
     if(IDOK!=dlg.DoModal())
         return;
     m_Image.Destroy();
     //将外部图像文件装载到CImage对象中
     hResult=m_Image.Load(dlg.GetFileName());
     if(FAILED(hResult))
     {
         MessageBox(_T("调用图像文件失败!"));
         return;
     }
     //设置主窗口标题栏内容
     CString str;
     str.LoadString(AFX_IDS_APP_TITLE);
     AfxGetMainWnd()->SetWindowTextW(str+_T("-")+dlg.GetFileName());
     Invalidate();//强制调用OnDraw函数
}                                                                                                                                          

你可能感兴趣的:(【MFC】CImage类的简单应用)