嗯,图片原始大小是2526*3563
这边是贴图代码,我创建的了一个与当前窗口DC的(hdc_C),通过 SelectObject() 将位图句柄选入内存兼容,然后使用 StretchBlt() 从内存兼容DC中拷贝图像到当前窗口使用的DC中,注意现在是默认拉伸模式。
这就是当前运行的答案。花得很严重吧,失真了?还是兄弟们冲多了老花眼了(*^_^*)?
但是不用担心,前辈们已经解决了这个问题 SetStretchBltMode() 在指定的设备上下文(HDC)中设置位图拉伸模式。先来看看MSDN上的介绍:
根据分析拉伸模式就是第二参数,我们当前需要 HALFTONE 或者 STRETCH_HALFTONE
(
将源矩形中的像素映射到目标矩形中的像素块。 目标像素块上的平均颜色近似于源像素的颜色。
设置 HALFTONE 拉伸模式后,应用程序必须调用 SetBrushOrgEx 函数来设置画笔原点。 如果无法执行此操作,则会发生画笔未对齐。
)
看看代码,也顺便看看默认模式是啥(注意mod的值)
按住 crl 键+鼠标点击 HALFTONE 进入头文件 wingdi.h
看这里(图中箭头指示的就是默认拉伸模式): BLACKONWHITE
(使用已消除和现有像素的颜色值执行布尔和操作。 如果位图是单色位图,则此模式会以牺牲白色像素为代价保留黑色像素。)
看说明是很迷惑的要在电脑上自己试试才知道
这下就成功了(等比例缩放不会扭曲图片肉眼上)
注意!!! SetStretchBltMode () 的第一参数,是你要贴在哪个的HDC上,不理解就与 StretchBlt() 的目标HDC一致就好(也就是第一参数)。
StretchDIBits()也是一样 使用在它之前 SetStretchBltMode() 设置一下拉伸模式就好了.
用与不用的区别 终: 左使用 右没有使用
图片后补了一张合规的