在OpenCV与MFC例程中,用的是IPLImage对象。如果用Mat图像数据类型,在一些地方做下改变:
1) 在创建LPBITMAPINFO文件头中,bits=workImg->depth*workImg->nChannels;改成bits=GetDepth(Image.depth())*Image.channels();其中,GetDepth(Image.depth())是图像位深度获取函数,因为Mat图像类型中,Image.depth()和IPlImage数据对象中的depth数值不同,Image.depth()只有0-6几种数
据情况,其中0,1代表8位,2,3代表16位,4,5代表32位,6代表64位图。应该写一个简单的函数描述其转换。GetDepth(Image.depth())中,if/else条件判断即可。
2) SetStretchBltMode(hdc,nStretchMode)函数
指定StretchBlt 和 StretchDIBits函数的伸缩模式。这种伸缩模式定义了Windows如何对伸缩过程中剔除的扫描线进行控制。对于VB窗体和控件,倘若在API绘图
过程中使用这个函数,建议恢复原来的StretchBlt模式。
参数信息:
hdc:场景的句柄
nStretchMode:
STRETCH_ANDSCANS:默认设置。剔除的线段与剩下的线段进行AND运算。这个模式通常应用于采用了白色背景的单色位图,若用在彩色图像上非等比缩放时会产生
杂线条。
STRETCH_DELETESCANS:剔除的线段被简单的清除。这个模式通常用于彩色位图。
STRETCH_ORSCANS:剔除的线段与剩下的线段进行OR运算。这个模式通常应用于采用了白色背景的单色位图。
STRETCH_HALFTONE:目标位图上的像素块被设为源位图上大致近似的块。这个模式要明显慢于其他模式。
因此在做StretchDIBits 函数之前,若非等比缩放,针对彩色图像应该加上SetStretchBltMode(pDC->m_hDC,STRETCH_DELETESCANS)语句。