vc中位图伸缩函数StretchBlt在对图片进行缩放时会造成严重的图片失真。在了解解决方法前先巩固下StretchBlt的用法:

StretchBlt

函数功能:函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

函数原型:BOOL StretchBlt(HDC hdc, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop); 

参数: 

hdcDest:指向目标设备环境的句柄。 

nXOriginDest:指定目标矩形左上角的X轴坐标,按逻辑单位表示坐标。 

nYOriginDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。 

nWidthDest:指定目标矩形的宽度,按逻辑单位表示宽度。 

nHeightDest:指定目标矩形的高度,按逻辑单位表示高度。 

hdcSrc:指向源设备环境的句柄。 

nXOriginSrc:指向源矩形区域左上角的X轴坐标,按逻辑单位表示坐标。 

nYOriginSrc:指向源矩形区域左上角的Y轴坐标,按逻辑单位表示坐标。 

nWidthSrc:指定源矩形的宽度,按逻辑单位表示宽度。 

nHeightSrc:指定源矩形的高度,按逻辑单位表示高度。 

dwRop:指定要进行的光栅操作。光栅操作码定义了系统如何在输出操作中组合颜色,这些操作包括刷子、源位图和目标位图等对象。参考BitBlt可了解常用的光栅操作码列表。 

返回值:如果函数执行成功,那么返回值为非零,如果函数执行失败,那么返回值为零。Windows NT:若想获得更多的错误信息,请调用GetLastError函数。
但是,StretchBlt函数缩放图片后图片失真严重,所以要用SetStretchBltMode函数来设置 StretchBlt(或StretchDIBits)函数的伸缩模式。具体用法是
调用StretchBlt前调用:
SetStretchBltMode(pDC->m_hDC,STRETCH_HALFTONE);

用StretchBlt,图像缩放是,失真很严重

有人说用pScreenDC->SetStretchBltMode(COLORONCOLOR),结果失真更严重了

发现pDC->SetStretchBltMode(HALFTONE);效果最佳

(其实都差不多)

深层了解:

函数原型:int SetSTretchBltMode(HDC hdc, int iStretchMode)

参数: 

hdc:设备环境句柄。 

LStretchMode:指定拉伸模式。它可以取下列值,这些值的含义如下: 

BLACKONWHITE:使用消除和现在的像素颜色值进行逻辑AND(与)操作运算。如果该位图是单色位图,那么该模式以牺牲白色像素为代价,保留黑色像素点。 

COLORONCOLOR:删除像素。该模式删除所有消除的像素行,不保留其信息。 

HALFTONE:将源矩形区中的像素映射到目标矩形区的像素块中,覆盖目标像素块的一般颜色与源像素的颜色接近。在设置完HALFTONE拉伸模之后,应用程序必须调用SetBrushOrgEx函数来设置刷子的起始点。如果没有成功,那么会出现刷子没对准的情况。 

STRETCH_ANDSCANS:与BLACKONWHITE一样。 

STRETCH_DELETESCANS:与COLORONCOLOR一样。 

STRECH_HALFTONE:与HALFTONE相同。 

STRETCH_ORSCANS:与WHITEONBLACK相同。 

WHITEONBLACK:使用颜色值进行逻辑OR(或)操作,如果该位图为单色位图,那么该模式以牺牲黑色像素为代价,保留白色像素点。 
返回值:如果函数执行成功,那么返回值就是先前的拉伸模式,如果函数执行失败,那么返回值为0。 

Windows NT:若想获得更多错误信息,请调用GetLastError函数。 
备注:拉伸模式在应用程序调用StretchBit函数时定义系统如何将位图的行或列与显示设备上的现有像素点进行组合。 

BLACKONWHITE(STRETCH_ANDSCANS)和WHITEONBLACK(STRETCH_ORSCANS)模式典型地用来保留单色位图中的前景像素。COLORONCOLOR(STRETCH_DELETESCANS)模式则典型地用于保留彩色位图中的颜色。 

HALFTONE模式比其他三种模式需要对源图像进行更多的处理,也比其他模式慢,但它能产生高质量图像,也应注意在设置HALFTONE模式之后,应调用SetBrushOrgEx函数以避免出现刷子没对准现象。 

根据设备驱动程序的功能不同,其他一些拉伸模式也可能有效

对比一下:

【VS开发】MFC学习之 解决StretchBlt()图片缩放绘图失真的更多相关文章

  1. MFC学习笔记

    获取窗口句柄 FindWindow               根据窗口名获取 GetSafehWnd                取你程序所在窗口类的句柄 GetActiveWindow     ...

  2. MFC双缓冲解决图象闪烁[转]

    转载网上找到的一篇双缓冲的文章,很好用.http://www.cnblogs.com/piggger/archive/2009/05/02/1447917.html__________________ ...

  3. Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

  4. 【干货推荐】Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

  5. iPhone应用开发 UITableView学习点滴详解

    iPhone应用开发 UITableView学习点滴详解是本文要介绍的内容,内容不多,主要是以代码实现UITableView的学习点滴,我们来看内容. -.建立 UITableView DataTab ...

  6. 值得 Web 开发人员学习的20个 jQuery 实例教程

    这篇文章挑选了20个优秀的 jQuery 实例教程,这些 jQuery 教程将帮助你把你的网站提升到一个更高的水平.其中,既有网站中常用功能的的解决方案,也有极具吸引力的亮点功能的实现方法,相信通过对 ...

  7. 解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)

    从事WPF开发一年有余,对于图片显示模糊相信很多人都遇到过.网络上查找能得到一堆解决方法,但都是会带来其他负面影响得不到最佳效果.其实,有些图片会因为垂直分辨率/水平分辨率不同而造成在WPF界面上显示 ...

  8. Android游戏与应用开发最佳学习路线图

    Android 游戏与应用开发最佳学习路线图 为了帮助大家更好的学习 Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家. 一.路线图概括: 二.具体需要掌握知识点: 三. ...

  9. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

随机推荐

  1. springboot无法识别配置文件级解决办法

    eclipse中右键项目bulid path 之后找到 后点击完成后点击运用 修改完成

  2. 记录一下使用element ui使用级联选择器的坑,级联选择器的默认选中

    Cascader 级联选择器 使用级联选择器我使用的是默认选中值 下面是我的数据格式,只是形式相同,值不同, 后台的数据是这样的不是ID //级联选择器 <el-cascader :props= ...

  3. Vue --- 指令练习

    scores = [ { name: 'Bob', math: 97, chinese: 89, english: 67 }, { name: 'Tom', math: 67, chinese: 52 ...

  4. 趣味编程:FizzBuzz(Haskell版)

    g :: Int -> Int -> Int -> String g n 0 0 = "FizzBuzz" g n 0 _ = "Fizz" ...

  5. SpringBoot整合Bubbo

    一.创建springboot_dubbo_provider项目 1 创建service层接口 public interface IDoSomeService { public String sayHi ...

  6. SpringBoot终章(整合小型进销系统)

    在前面的章节中我们学习Spring的时候可以看到配置文件比较多,所以我们有了SpringBoot 1. 引入依赖 <dependencies> <dependency> < ...

  7. 好的想法只是OKR的开始--创业者谨记

    每一个出版过作品的作家都有这样的体验:有人找到你,说他有一个极妙的想法,并迫不及待的想和你一起实现这个想法:结局也总是差不多,它们艰难的完成了灵感部分,而你只需要简单的把它写成小说,收益则需要五五分成 ...

  8. 【loj3123】【CTS2019】重复

    题目 给出一个长度为\(n\)的串\(s\),询问有多少个长度为\(m\)的串\(t\) 满足 \(t\) 的无限循环串存在一个长度为\(n\)且比\(s\)字典序严格小的子串 $ n , m \le ...

  9. 详解匿名内部类 ,形参为什么要用final

    一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部 ...

  10. A. The Fair Nut and Elevator (Codeforces Round #526 (Div. 2))

    A. The Fair Nut and Elevator 好笨啊QAQ. 暴力枚举的题,连分类都不用. 从电梯初始位置到第一层.人到第一层.间隔的层数,往返路程. #include <bits/ ...