VC中StretchBlt的模态和失真问题
用相机导入图像,显示在对话框的图像控件中。
现象:原本应该是黑白相机的灰度图像显示为五颜六色的彩色图像。
开始的时候
收集的数据似乎有问题,但从保存的bmp文件来看是正常的。 可以确认正在显示程序
问题。 问题是,基本上是按照sdk的sample一行一行地抄。 唯一的区别是sdk是一个单位
查看项目中可用的所有族。 我的程序显示在对话框的图像控件中。 最有可能出错的是
stretchdibits(PDC-getsafehdc )、
rect.left,
rect.top,
rect.Width ()、//显示窗口宽度
显示rect.Height ()、//窗口的高度
0,
0,
Width,//图像宽度
高,//图像高度
m_pImageBuffer,//图像缓冲器
m_pBmpInfo,//BMP图像描述信息
DIB_RGB_COLORS,
src复制
);
认真检查了所有参数,没有发现异常。
去百度和谷歌疯狂搜索,再重建对话框项目,加载并显示图像。 问题
再现,偶然看到http://hi.Baidu.com/68400165/blog/item/fa 2409 c 66 ab 7e2DBD 000601 a.html中
说到由StretchDIBits引起的失真问题,
添加PDC-setstretchbltmode (硬件);
解决问题!
添加网络文章:
在VC中使用StretchBlt时,会出现一些与调整位图大小相关的问题。 扩展位图时,StretchBlt必须复制像素的行或列。 如果放大率不是原始图像的整数倍,则此操作会使图像稍微失真。
如果所需矩形小于原始矩形,则StretchBlt在缩小图像时必须将两行、多行或多列像素合并为一行或多列。 有四种方法可以做到这一点。 根据装置的内容扩展模式属性,选择一种方法。 可以使用SetStretchBltMode函数更改此属性。
setstretchbltmode(HDC,iMode;
iMode可以具有以下值:
“BLACKONWHITE”或“STRETCH_ANDSCANS”(聘用) :如果需要将两个或多个像素合并为一个像素,则StretchBlt将对像素执行逻辑AND运算。 这意味着,只有当所有原始像素都为白色时,该像素才为白色,而实际上黑色像素控制着白色像素。 这主要适用于白色背景中的黑色单色位图。
如果需要将WHITEONBLACK或STRETCH_ORSCANS两个或多个像素合并为一个像素,StretchBlt将执行逻辑OR运算。 因此,只有在所有原始像素都为黑色时才会变为黑色。 也就是说,颜色由白色像素决定。 这主要适用于黑色背景中白色单色的位图。
COLORONCOLOR或STRETCH_DELETESCANS:StretchBlt只删除像素的行或列,而没有逻辑组合。 这通常是处理彩色位图的最好方法。
HALFTONE或STRETCH_HALFTONE:Windows根据组合的源颜色计算所需的平均颜色。 它与半色调调色板配合使用,第16章介绍了该过程。
使用StretchBlt缩小图像可能会导致颜色失真。 解决步骤如下。
1、首先把目标直流(即HDC hDestDC ) :3360setstretchbltmode ) HDEstdc,HALFTONE
2、尝试调用:3360setbrushorgex(HDEstdc,0,0,NULL );
3、最后调用CImage的StretchBlt
或者这样解决:
1。 hbit=(hbitmap ) loadimage (空,cBmpPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE );
if(hbit!=空) {
bitmap.attach(hbit;
DC兼容. createcompatibledc (getdc );
DC兼容. select object (bitmap;
bitmap.getobject(sizeof(bm ),BM ); }
2。 OnPaint () :
PDC-setstretchbltmode(Halftone );
PDC-stretchblt(map_left,MAP_TOP,MAP_WIDTH,MAP_HEIGHT,
DC兼容,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY;