StretchBlt()函数使用

article/2025/11/5 8:17:06

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

说白了功能就是缩放。

 

函数原型如下

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

 

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

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

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

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

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

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

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

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

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

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

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

    返回值:如果函数执行成功,那么返回值为非零,如果函数执行失败,那么返回值为零。Windows NT:若想获得更多的错误信息,请调用GetLastError函数。

    注意:但是函数使用前要使用SetStretchBltMode函数,该函数可以设置指定设备环境中的位图拉伸模式。

    函数原型: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函数以避免出现刷子没对准现象。

根据设备驱动程序的功能不同,其他一些拉伸模式也可能有效。
函数原型: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函数以避免出现刷子没对准现象。

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

   下面代码实现的是获取桌面并且显示到图片控件里面

		CDC *pdcdesk = GetDesktopWindow()->GetWindowDC();  //获取窗口dcCDC memdc;memdc.CreateCompatibleDC(pdcdesk); //创建兼容内存DCCBitmap bmp;CRect re;GetDesktopWindow()->GetWindowRect(&re);  //获取窗口大小bmp.CreateCompatibleBitmap(pdcdesk , 400 , 300);  //创建兼容位图CBitmap *oldbitmap = memdc.SelectObject(&bmp);memdc.SetStretchBltMode(HALFTONE);         //图像使用StretchBlt()之前一定定义这个//	memdc.SetStretchBltMode(BLACKONWHITE);memdc.StretchBlt(0,0,400,300,pdcdesk , 0,0,re.Width(),re.Height() , SRCCOPY);//缩小图像memdc.SelectObject(oldbitmap);((CStatic*)GetDlgItem(IDC_PIC))->SetBitmap(bmp);//删除相关memdc.DeleteDC();bmp.DeleteObject();


 

 没使用函数的时候图像是下面这样:

 

 

使用之后得到下面图像:


 可以看到使用之后图片有鲜明的变化!

 


http://chatgpt.dhexx.cn/article/4QK5Gvfy.shtml

相关文章

STL_set/multiset

STL_set/multiset 简介:本文主要介绍STL中的,set与multiset的使用,只需要把本文的代码自己敲完便可学会。 set容器的基本概念 注意:set容器没有push_back, pop_back这两种插入接口,只能用insert函数进行插入 如果向s…

Column-Stores vs. Row-Stores: How Different Are They Really?

Column-Stores vs. Row-Stores: How Different Are They Really? 论文阐述的就是行存与列存 两者之间到底有什么区别 Abstract 论文首先给出结论:列式存储(Column Stores)比行式存储(Row Stores)在性能上好过一个数…

android:stretchcolumns=0,1,2,3,android:stretchColumns用法

TableLayout是一个使用复杂的布局&#xff0c;最简单的用法就仅仅是拖拉控件做出个界面&#xff0c;但实际上&#xff0c;会经常在代码里使用TableLayout&#xff0c;例如做出表格的效果。本文主要介绍TableLayout的基本使用方法。 < ?xml version"1.0" encoding…

cannot set a row with mismatched columns

错误&#xff1a;cannot set a row with mismatched columns 错误背景原错误情况错误原因解决方法 错误背景 在希望将dataframe a 中的特定行移至dataframe b 时出错&#xff0c;记录下自己使用的方法 原错误情况 #dataframe a 已知 a{ab:[1,2,3],bb:[3,4,5],cb:[4,5,6]} a …

TableLayout中stretchColumns、shrinkColumns的用法

android:stretchColumns"1" android:shrinkColumns"1"这两个属性是TableLayout所特有的&#xff0c;也是这两个属性影响了子对象的布局。 表格布局是按照行列来组织子视图的布局。表格布局包含一系列的Tabrow对象&#xff0c;用于定义行&#xff08;也可以…

TableLayout中stretchColumns和shrinkColumns使用

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientatio…

基于JAVA的即时通信软件

一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件&#xff0c;利用 Java Socket 进行点到点通信&#xff0c;其工作机制模仿即时通信软件的基本功能&#xff0c;已实现的功能有&#xff1a; 客户端登录 客户端退出 群组成员之间传输文字或图片信息 该软件分为客…

一文教你用java实现即时通讯软件的设计

即时通讯软件即所谓的聊天工具&#xff0c;其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具&#xff0c;使用Socket建立通讯渠道&#xff0c;多线程实现多台计算机同时进行信息的传递&#xff0c;swing技术等进行实际开发相对比较合适。通过…

即时通讯软件七大优势详解

在以前&#xff0c;即时通讯软件被认为是一种专供个人使用的通信工具&#xff0c;随着社会的发展&#xff0c;各大商家企业开始慢慢接受这种通信工具并利用其协调公司内部沟通&#xff0c;从而满足公司的业务需求。那么即时通讯软件优势有哪些&#xff1f;为你细数它的七大优势…

开发IM即时通讯容易吗?需要什么技术

即时通讯现在已经随着互联网技术的应用走进了千家万户&#xff0c;跟早些年的通信工具不同&#xff0c;现在的即时通讯技术已经涵盖了语音即时通讯、视频即时通讯、文字即时通讯等多种方式&#xff0c;而开发即时通讯也成了很多互联网企业投身这一行业后想要尝试的内容。开发即…

桌面软件开发框架大赏

本文基于海康威视桌面端技术专家刘晓伦在「RTC Dev Meetup • 杭州站丨大前端时代的业务架构和跨端实践」活动中分享内容二次整理。 以下正文&#xff1a; 今天要与大家分享 19 款桌面软件开发框架&#xff0c;我将它们分了四类&#xff0c;然后分别就每个类别做相应的介绍&a…

仿QQ即时通讯软件开发-赖国荣-专题视频课程

仿QQ即时通讯软件开发—7495人已学习 课程介绍 会使用JAVA的Swing做UI&#xff0c;学会用JAVA操作数据库&#xff0c;用Java的网络编程&#xff0c;多线程编程&#xff0c;制作一个仿QQ的即时通讯软件&#xff0c;实现在局域网或者互联网通讯 课程收益 制作仿QQ即时通讯软件…

Qt制作局域网即时通讯软件

Qt制作局域网即时通讯软件 利用Qt制作的局域网即时通信软件&#xff0c;可实现文本信息、表情包、图片、文档等的传输功能。界面风格模仿的Tim&#xff0c;所以本软件取名为Timi&#xff0c;tim的mini版本。 登录界面&#xff1a;使用之前做的登录界面&#xff0c;后续修改。原…

java实现即时通讯软件

导读:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相对比较合适。通过一些轻松的注册登录后,在局域网中即…

IM即时通讯软件系统源码安卓、苹果、PC端全开源!

demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.《计算机系统结构&#xff1a;解析思路习题》课后答案 "本书是按照全国高等教育自学考试指导委员会制定的计算机及应用专业独立本科段“计算机系统结构自学考试大纲’’要求&#xff0c;并以其指定的自学教材内…

即时通讯软件开发:如何解决网络不稳定的问题?

随着智能手机和互联网的普及&#xff0c;即时通讯软件成为人们生活中不可或缺的一部分。随着即时通讯软件的使用越来越普及&#xff0c;网络不稳定的问题也越来越严重。为了提供更好的服务&#xff0c;我们需要解决这个问题。 网络不稳定的原因 网络不稳定可能由许多因素引起…

im即时通讯软件开发:一文即懂什么是高并发

在即时通讯网社区里&#xff0c;多是做IM、消息推送、客服系统、音视频聊天这类实时通信方面的开发者&#xff0c;在涉及到即时通讯技术时聊的最多的话题就是高并发、高吞吐、海量用户。 代码还没开始写&#xff0c;就考虑万一哪天这IM用户量破百万、千万该怎么办的问题&#…

即时通讯软件源代码_提高软件开发效率的神器,马上收藏起来吧

根据用户开发水平的差异&#xff0c;力软敏捷开发框架提供多种实现业务功能的开发模式。 如果您是初级开发者或者您根本就不会编程那也不要紧&#xff0c;系统可以根据开发向导直接进行功能开发&#xff0c;不需要编写一行代码也无需编译就个完成开发过程。 如果您是一名专业的…

QT开发的即时通讯聊天软件

最近项目需求用QT开发了一款即时通讯软件&#xff0c;差不多了上几个图看看。 登陆界面 主界面-用户列表 最近消息界面 好友聊天界面 文件传输界面 查找和添加好友 消息管理器 系统设置界面 先传这么多&#xff0c;&#xff1a;&#xff09;

基于C++的即时通信软件设计

目录 — 、 概 述 1 1 . 1 设 计 目 的 &#xff1a; 1 1 . 2 设 计 内 容 &#xff1a; 1 1 . 2 . 1 功 能 设 计 &#xff1a; 1 1 . 2 . 2 界 面 设 计 &#xff1a; 1 1 . 2 . 3 客 户 端 、 服 务 器 设 计 &#xff1a; 1 1 . 3 设 计 要 求 &#xff1a; 1 二 、 设 计 …