WIN32 stretchBlt与StretchDIBlts图像失真问题解决

嗯,图片原始大小是2526*3563 

 WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第1张图片

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第2张图片

这边是贴图代码,我创建的了一个与当前窗口DC的(hdc_C),通过 SelectObject() 将位图句柄选入内存兼容,然后使用 StretchBlt() 从内存兼容DC中拷贝图像到当前窗口使用的DC中,注意现在是默认拉伸模式。

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第3张图片

这就是当前运行的答案。花得很严重吧,失真了?还是兄弟们冲多了老花眼了(*^_^*)?

 但是不用担心,前辈们已经解决了这个问题  SetStretchBltMode()  在指定的设备上下文(HDC)中设置位图拉伸模式。先来看看MSDN上的介绍:

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第4张图片

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第5张图片

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第6张图片

根据分析拉伸模式就是第二参数,我们当前需要  HALFTONE 或者 STRETCH_HALFTONE

(        

将源矩形中的像素映射到目标矩形中的像素块。 目标像素块上的平均颜色近似于源像素的颜色。

设置 HALFTONE 拉伸模式后,应用程序必须调用 SetBrushOrgEx 函数来设置画笔原点。 如果无法执行此操作,则会发生画笔未对齐。

        )

看看代码,也顺便看看默认模式是啥(注意mod的值)

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第7张图片

 按住 crl 键+鼠标点击 HALFTONE 进入头文件 wingdi.h 

看这里(图中箭头指示的就是默认拉伸模式): BLACKONWHITE

(使用已消除和现有像素的颜色值执行布尔和操作。 如果位图是单色位图,则此模式会以牺牲白色像素为代价保留黑色像素。) 

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第8张图片

看说明是很迷惑的要在电脑上自己试试才知道

 这下就成功了(等比例缩放不会扭曲图片肉眼上)

 

 注意!!!  SetStretchBltMode () 的第一参数,是你要贴在哪个的HDC上,不理解就与 StretchBlt()  的目标HDC一致就好(也就是第一参数)。

StretchDIBits()也是一样  使用在它之前 SetStretchBltMode() 设置一下拉伸模式就好了.

用与不用的区别 终:   左使用  右没有使用

WIN32 stretchBlt与StretchDIBlts图像失真问题解决_第9张图片

 图片后补了一张合规的

你可能感兴趣的:(我的Windows游戏编程梦,windows,c++)