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

嗯,图片原始大小是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() 设置一下拉伸模式就好了.

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

 图片后补了一张合规的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值