MFC如何在对话框的图片控件中显示真彩色图像
这是要显示的原图
这是显示效果,估计是8位或者16位了,怎么改正,求救,下面是主要代码(点击“打开”按钮的响应)
void CimageDlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
CString lpszPathName;
CRect rect;
CDC* pDC;
CFileDialog fpdlg(TRUE);
if(fpdlg.DoModal()==IDOK)
{
lpszPathName=fpdlg.GetPathName();
}
if(!(lpszPathName==_T("")))
{
m_image.Load(lpszPathName);
}
GetDlgItem(IDC_PICTURE)->GetClientRect(&rect);
pDC=GetDlgItem(IDC_PICTURE)->GetDC();
m_image.StretchBlt(pDC->m_hDC,rect);
}
m_image是一个CImage类对象 展开
MFC图片控件的标准方法(在控件属性中指定资源ID)是不能显示真彩图像的,其默认最高支持是256色,也就是8bit位图。
通过编程实现在对话框中显示真彩图像有两种方法:
不使用图片控件,而是直接在对话框的DC上绘制,如果获取的是对话框的DC并通过静态框等获取区域(也可以指定区域),那么你的其它代码不需要改动。
使用图片控件。获取图片控件的DC后,因为图片控件默认是256色,其DC中对Stretch拉伸默认是像素损失模式,因此你的图像会失真。这时就要在拉伸显示之前,重新设置图片控件的拉伸损失模式为像素接近模式:
pDC->SetStretchBltMode(HALFTONE);
需要注意的是,HALFTONE模式能产生高质量图像,但也是效率最低显示最慢的模式,如果图片较大或者调用频繁,不建议使用。同时,也应注意在设置HALFTONE模式之后,最好调用SetBrushOrgEx函数以避免出现刷子没对准现象。
另外,获取真彩图像句柄(指针)的方法也有很多,可以使用CImage,也可以使用其他GDI+对象,另外也可以使用图片解析代码实现。MFC的图片资源,同样默认是256色,需要特殊的方法才能加载真彩位图。
你这是图像缩放失真的结果,根据我的经验在显示图像前添加一句防止图像失真的语句试试看:
pDC->SetStretchBltMode( HALFTONE ); //防止图像缩放失真