MFC图形函数学习12——位图操作函数

news2024/11/28 16:49:16

       位图即后缀为bmp的图形文件,MFC中有专门的函数处理这种格式的图形文件。这些函数只能处理作为MFC资源的bmp图,没有操作文件的功能,受限较多,一般常作为程序窗口界面图片、显示背景图片等用途。有关位图操作的步骤、相关函数等介绍如下。
一、将bmp文件导入VS成为MFC中的资源
       步骤:解决方案资源管理器->右键资源文件->添加->资源->Bitmap->导入。
       此时,bmp文件已经进入到MFC中成为MFC的资源;在资源视图中,点开Bitmap,可以看到“IDB_BITMAP1”,这就是导入位图的ID号,右键这个ID号可通过属性修改ID号。在后面的处理过程中,需要使用这个位图时,都要提供这个ID号。
二、位图操作函数
(一)创建与指定设备上下文兼容的内存设备上下文函数
       原型:virtual BOOL CreateCompatibleDC(CDC* pDC)
       参数:pDC是显示设备上下文的指针
       返回:创建成功返回非0数(真);否则返回0(假)
       说明:
       a.这个函数是CDC类的成员函数,使用这个函数时需要CDC类对象或指针调用。
       b.所谓设备上下文就是计算机的显示设备,具体到我们这里就是显示窗口。函数的参数即是当前显示窗口的指针,这里利用这个指针并调用CreateCompatibleDC函数的目的就是生成一个与当前显示窗口相兼容的CDC类对象(在内存中),然后在这个对象中处理bmp位图资源。由于彼此兼容,可以将处理好的兼容对象中的内容一次性传送到当前显示窗口中。
(二)载入位图函数
       原型:BOOL LoadBitmap(UNIT nIDResource);
       参数:nIDResource位图资源ID编号
       返回值:载入成功返回非0值,失败返回0
       说明:
       a.函数LoadBitmap属于CBitmap类的成员函数,使用这个函数需要CBitmap对象调用。
       b.参数就是前面介绍的导入到MFC中的bmp资源的ID。
       c.通过这个函数,位图资源从MFC系统资源被导入到我们的程序中,我们可以对其操作了。
(三)获取位图信息函数
       原型:int GetBitmap(BITMAP* pBitMap);
       参数:pBitMap是BITMAP结构体的指针
       返回值:获取信息成功返回非0数;失败返回0。
       说明:
       a.函数GetBitmap是CBitmap类的成员函数,使用时需要CBitmap类对象调用。
       b.实际上获取的信息就是调用它CBitmap对象的信息,包括位图的宽度、高度、颜色格式和位图的字节数据等信息。
       c.从步骤上说,CBitmap对象应先通过调用LoadBitmap函数载入位图。
(四)位块传送函数
       原型:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,DWORD dwRop);
       参数:x,y,nWidth、nHeight目标矩形左上角坐标和源位图的宽高
                 pSrcDC是CDC对象的指针,指向被拷贝的位图
                 xSrc和ySrc是源位图的左上角
                 dwRop光栅操作码
       返回值:传送成功返回非0数;失败返回0。
       说明:
        a.函数BitBlt是CDC类的成员函数,使用时需要CDC类对象、指针调用。
        b.该函数的功能是将源位图中部分或全部区域按原区域大小复制到目标对象。
        c.当目标矩形指针指向当前窗口时,被拷贝的内容会显示到屏幕上。
        d.关于光栅操作码的取值有很多,如仅仅是把位图显示到窗口,取值为SRCCOPY。如需要对图像像素进行处理可以选用其它光栅操作码。
(五)拉伸位图函数
        原型:BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);
        参数:x,y,nWidth,nHeight目标矩形坐标及长宽
                  pSrcDC是CDC类对象指针,指向源位图
                  xSrc、ySrc,nSrcWidth、nSrcHeight源位图矩形坐标及长宽
                  dwRop 光栅操作码
       返回值:处理成功返回非0数,否则返回0。
       说明:
       a.函数StretchBlt是CDC类的成员函数,使用时需要CDC类指针调用。
       b.该函数的功能不仅仅是字面含义的拉伸,也可以压缩、变形等。
       c.当目标矩形指针指向当前窗口时,被拷贝的内容会显示到屏幕上。
       d.光栅操作码同上一个函数。
       e.当目标矩形长宽与源矩形长宽一致时,函数的功能与BitBlt相同。
       f.由于这个函数在处理过程中存在变形,会造成图像显示失真,为解决失真问题,可以在调用StretchBlt函数前,调用SetStretchBltMode函数设置一下拉伸模式,参数使用COLORONCOLOR或HALFTONE就不变形了。SetStretchBltMode函数是CDC类的成员函数,使用时需要CDC对象或指针调用。
       e.关于坐标系问题,建议使用设备坐标系;上面那个函数也同样。
三、MFC中关于位图的操作函数,既复杂功能又弱,使用起来效果不是太好,关于图像处理,有一个共享类CImage,它可以在C++、MFC中调用,笔者曾写过一篇短文《CImage成员函数Load、Create、Draw、Save使用方法简介》介绍了它的主要函数以及在C++中的使用,在笔者“C++/MFC/easyX相关知识”专栏中可以看到,这个类功能强大,使用简单。方便时将对这个类更多的函数以及在MFC中的使用做进一步的介绍。
四、上面几个函数的使用方法的举例程序
       题目:将一张荷花图片显示到窗口上,然后画一个红色边框填充为透明的椭圆,将图片中的荷花圈起来。步骤如下:
(一) 先按照本文开头讲的步骤,将bmp图形文件导入到MFC中,ID号使用缺省ID:IDB_BITMAP1。
(二)其它代码及注释如下:(运行时将代码考入OnDraw函数中)

//一、获得窗口数据
	CRect rect;
	GetClientRect(rect);
       //使用设备坐标系,这里获取窗口数据是为了后边显示图片使用
//二、载入一幅荷花图片并显示在窗口
	CDC myDC; //声明CDC对象
	myDC.CreateCompatibleDC(pDC); //初始化myDC是指与pDC兼容
	CBitmap myBitmap;//声明位图类对象
	myBitmap.LoadBitmapW(IDB_BITMAP1);//将MFC位图资源载入位图对象
	CBitmap* oldBitmap = myDC.SelectObject(&myBitmap); //将位图对象选入兼容CDC类对象
	BITMAP info; //声明位图结构体对象
	myBitmap.GetBitmap(&info);//获取位图长宽等信息
	pDC->SetStretchBltMode(COLORONCOLOR);//设置拉伸位图模式
	pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &myDC, 0, 0, info.bmWidth,info.bmHeight,SRCCOPY);
	  //使用拉伸位图函数将位图(来自于MFC资源)传送到屏幕上的窗口中
	pDC->SelectObject(oldBitmap);//恢复CDC中的缺省位图
	myBitmap.DeleteObject();//清空bitmap对象
	myDC.DeleteDC();//清空memDC
//三、画一个边框红色、填充为透明的圆
	CPen redPen(PS_SOLID,3,0x0000ff);//声明红色画笔
	CPen* oldPen=pDC->SelectObject(&redPen); //将画笔选入CDC
	CBrush* oldBrush =(CBrush*)pDC->SelectStockObject(NULL_BRUSH);//选入透明库画刷
	pDC->Ellipse(300, 100, 900, 500);//画椭圆
	pDC->SelectObject(oldPen);//恢复缺省画笔
	pDC->SelectObject(oldBrush);//恢复缺省画刷

运行结果截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.Three.js纹理动画与动效墙案例

12.Three.js纹理动画与动效墙案例 在Three.js的数字孪生场景应用中,我们通常会使用到一些动画渲染效果,如动效墙,飞线、雷达等等,今天主要了解一下其中一种动画渲染效果:纹理动画。下面实现以下动效墙效果&#xff08…

SJYP 24冬季系列 FROZEN CHARISMA发布

近日,女装品牌SJYP 2024年冬季系列——FROZEN CHARISMA已正式发布,展现了更加干练的法式风格。此次新品发布不仅延续了SJYP一贯的强烈设计风格和个性时尚,更融入了法式风情的干练元素,为消费者带来了一场视觉与穿着的双重盛宴。  …

无人机产业发展如何?如何进行产业分析?

▶无人机产业发展现状:高速增长 1.市场规模和增长趋势: 全球无人机市场规模在2021年约为256亿美元,同比增长14%。中国民用无人机市场规模在2021年达到869.12亿元,显示出市场的快速增长。 预计到2029年,中国无人机市…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

DVWA靶场——File Inclusion

File Inclusion(文件包含)漏洞 指攻击者通过恶意构造输入,利用应用程序错误的文件包含机制,导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中,尤其是在那些允许用户提供文件路径或URL的地…

Ubuntu下用Docker部署群晖系统---Virtual DSM --zerotier实现连接

Ubuntu下用Docker部署群晖系统—Virtual DSM --zerotier实现连接 1. Docker 安装 安装最新docker curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo docker run hello-world2.docker-compose 安装 sudo pip install docker-compose测试安装是否成功…

神经网络(系统性学习四):深度学习——卷积神经网络(CNN)

相关文章: 神经网络中常用的激活函数神经网络(系统性学习一):入门篇神经网络(系统性学习二):单层神经网络(感知机)神经网络(系统性学习三)&#…

数据结构C语言描述5(图文结合)--队列,数组、链式、优先队列的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

打开windows 的字符映射表

快捷键 win R 打开资源管理器 输入: charmap 点击确定

EPS生成垂直模型闪退

问题描述 EPS在生成垂直模型时闪退。 解决办法在这里插入图片描述 原DSM文件和DOM文件分别在单独文件夹中。 将这几个文件统一放在一个文件夹中,并且注意路径不要太复杂。 成功运行,文件大时,处理会非常缓慢。

4——单页面应用程序,vue-cli脚手架

单页面应用程序(英文名:Single Page Application)简称 SPA,顾名 思义,指的是一个 Web 网站中只有唯一的一个 HTML 页面,所有的功能与交互都在这唯一的一个页面内完成。 1、脚手架 ① 什么是脚手架 vue-cli 是 Vue.js 开发的标准工具。它简化了程序员基于 webpack …

嵌入式Qt使用ffmpeg视频开发记录

在此记录一下Qt下视频应用开发的自学历程,可供初学者参考和避雷。 了解常用音频格式yuv420p、h264等了解QML,了解QVideoOutput类的使用,实现播放yuv420p流参考ffmpeg官方例程,调用解码器实现h264解码播放 不需要手动分帧。ffmpeg…

kmeans 最佳聚类个数 | 轮廓系数(越大越好)

轮廓系数越大,表示簇内实例之间紧凑,簇间距离大,这正是聚类的标准概念。 簇内的样本应该尽可能相似。不同簇之间应该尽可能不相似。 目的:鸢尾花数据进行kmeans聚类,最佳聚类个数是多少? plot(iris[,1:4…

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段,遇到宽依赖会断开,所以在stage 与 stage 之间会产生shuffle,大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…

Ubuntu20.04安装kalibr

文章目录 环境配置安装wxPython下载编译测试报错1问题描述问题分析问题解决 参考 环境配置 Ubuntu20.04,python3.8.10,boost自带的1.71 sudo apt update sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost…

转录组数据挖掘(生物技能树)(第11节)下游分析

转录组数据挖掘(生物技能树)(第11节) 文章目录 R语言复习转录组数据差异分析差异分析的输入数据操作过程示例一:示例二:示例三:此代码只适用于人的样本 R语言复习 #### 读取 ####dat read.deli…

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…

洛谷刷题之p1631

序列合并 题目入口 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B,在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N; 第二…

【漏洞复现】CVE-2022-24697

漏洞信息 NVD - CVE-2022-24697 Kylin’s cube designer function has a command injection vulnerability when overwriting system parameters in the configuration overwrites menu. RCE can be implemented by closing the single quotation marks around the parameter…

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2

七、创建前端项目 你下载了nodejs吗?从cn官网下载:http://nodejs.cn/download/,或者从一个国外org网站下载,选择自己想要的版本https://nodejs.org/download/release/,双击下载好的安装文件,选择安装路径安…