CImage成员函数Load、Create、Draw、Save使用方法简介

       在Visual C++中若想处理图片,可以使用CBitmap 类或静态图片控件。但它们处理只能处理BMP格式的图片、图标、光标以及图元文件等;使用起来非常受限,因此我们一般只是在做程序界面时使用。而CImage可以处理JPGE、GIF、BMP、PNG等多种格式图片,包括格式转换、裁切、复制、拼接等许多应用方法。CImage类表面上看像是MFC的封装类,其实它是MFC和ATL共享的新类,它也可以在非MFC环境下使用。本文就CImage的主要成员函数Load、Draw、Save的使用方法做一简单介绍。
一、介绍内容
       CImage类对象通过调用其成员函数Load从磁盘中载入诸如JPEG、GIF、BMP和PNG格式的图片文件进行处理,再调用Draw函数将图片文件绘制到另外一个CImage类对象中(包括复制、缩放等),最后通过Save函数可以保存图片文件,也可以利用Save相互转换图片文件的格式。
二、使用CImage类Load、Create、Draw、Save几个函数的一般步骤:
     <1>包含头文件:
            #include<atlimage.h> //在C++空项目中需要包含这个头文件,而在高版本MFC不需如此即可使用CImage
     <2>声明一个CImage类对象,然后调用其成员函数Load加载一个图片文件。
            CImage srcImage;  //原图像
            srcImage.Load("路径\\文件名.jpeg"); 
     <3>再声明一个CImage对象,然后调用Create函数生成一个空白的图像(实际是全黑)。
            CImage destImage;//目标图像
            destImage.Create(destWidth,destHeight,bpp); //前两个参数的单位是像素,bpp是位深度,jpeg的位深度是24
             说明:如果不使用Create函数,而是仍然使用Load函数,则可以将两幅图片组合到一起,变化还有很多,可以试验。
      <4>调用成员函数Draw绘制图像,亦即把原图像中的全部或部分内容复制到目标图像中。
            BOOL Draw (HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight);
                 //a. 调用Draw函数的是原图像对象,即srcImage.Draw( ... ... ),不要弄混淆
                 //b. HDC hDestDC是目标图像对象的设备上下文指针,可以通过destImage.GetDC()获得,注意指针使用完毕要用destImage.ReleaseDC()语句将指针释放,否则,再次获取指针时会报错。
                 //c. xDest与yDest,目标图像中拟粘贴区域的左上角坐标(单位:像素)
                 //d. nDestWidth与DestHeight,目标图像中拟粘贴区域的宽、高
                 //e. xSrc与ySrc,源图像中拟复制域左上角坐标
                 //h. nSrcWidth与nSrcHeight,原图像中拟复制区域宽、高
                 说明:从函数的参数表可以看出,原图像复制区域与目标图像的粘贴区域大小可以不同,亦即可以通过Draw函数对图像进行缩放;但大小不同时,可能会发生图像颜色失真现象,为解决这一问题,可以在调用Draw函数前,增加一条语句:SetStretchBltMode(destImage.GetDC(), COLORONCOLOR); 注意这里是对目标图像对象进行设置,不要弄反。
        <5>调用Save函数将目标图像保存到文件中
               destImage.Save("路径\\文件名.jpeg"); //这里,如把文件后缀改变,则可以改变文件格式(当然前面提到的位深度bpp要改变)
        CImage类的成员函数还有很多,这里介绍的只是常用的几个。

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

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

相关文章

1.11.。。。

1 有道云笔记 2 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTextToSpeech>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QW…

江科大STM32

参考&#xff1a; https://blog.csdn.net/weixin_54742551/article/details/132409170?spm1001.2014.3001.5502 https://blog.csdn.net/Johnor/article/details/128539267?spm1001.2014.3001.5502 SPI&#xff1a;https://blog.csdn.net/weixin_62127790/article/details/132…

【SAP-PP】生产订单导入问题--完成日期向前推了一天

问题描述&#xff1a; 在执行BAPI_PRODORD_CREATE生产订单导入的时候&#xff0c;发现填写入模板中的基本完成日期是12月31日&#xff0c;但是到具体工单时变成了12月30日 截图说明&#xff1a; 感觉很神奇&#xff0c;咋一看&#xff0c;真的是日期提前了一天&#xff0c;de…

CMake入门教程【高级篇】qmake转cmake

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2.qmake与cmake的差异3. qmake示例4.qmake转cmake示例5.MOC、UIC和RCC…

快速开发、打包、上架一个 uTools 插件

本文将从零开始&#xff0c;一步步完成整个开发、打包和上架流程。 打开 uTools&#xff0c;搜索 uTools 开发者工具&#xff1a; 新建项目&#xff1a; 填写插件信息&#xff1a; 直接下载一个 uTools 启动模板&#xff1a;https://gitee.com/penggeor/utools-plugin-start…

单摆波运动

1、简介 单摆波运动通常由15个单摆小球完成&#xff0c;每个小球的线长不一致&#xff0c;线长从一端至另一端依次增长。线长不一致会导致运动周期不一致&#xff0c;故而单摆波运动中的每个小球运动都不同&#xff0c;且能在规则与不规则运动间转换。单摆波运动如下所示&…

安卓检查通话自动录音功能是否开启,并跳转到开启页面

介绍 本文章主要介绍安卓检查通话自动录音功能是否开启,并跳转到相应的开启页面,主要介绍小米,华为、vivo和oppo手机,其他手机暂不做介绍 检查手机自动录音 小米 /*** 检查小米手机自动录音功能是否开启,true已开启 false未开启** @return*/private boolean checkXia…

【QML COOK】- 007-Item对象、信号和槽

信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的独特的设计&#xff0c;自然在QML中也被支持。 Item是QML所有类型的基类&#xff0c;Item类型不会显示在窗口上&#xff0c;但是可以支持信号和槽。本节就用Item编写一个信号和槽的实例。 1. 创建Q…

Linux-shell简单学习

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

Maven 依赖管理项目构建工具 教程

Maven依赖管理项目构建工具 此文档为 尚硅谷 B站maven视频学习文档&#xff0c;由官方文档搬运而来&#xff0c;仅用来当作学习笔记用途&#xff0c;侵删。 另&#xff1a;原maven教程短而精&#xff0c;值得推荐&#xff0c;下附教程链接。 atguigu 23年Maven教程 目录 文章目…

Leetcode 1049 最后一块石头的重量II

题意理解&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。 思路转化&#xff1a;我们可…

【计算机组成-指令系统体系结构】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 设计自己的计算机 一个简单的计算机指令系统 运算类指令&#xff1a;ADD R&#xff0c;M&#xff1b;功能&#xff1a;将R的内容和M中的内容相加后存入R传送类指令&#xff1a;LOAD R&#xff0c;M&#xff1b;…

03.C++内存管理笔记

1、C/C内存分布 ①内存分那么多区的原因&#xff1a;不同的数据&#xff0c;有不同的存储需求&#xff0c;各区域满足了不同的需求。 ②存放&#xff1a; 临时变量等临时用的变量&#xff1a;栈区&#xff1b; 动态申请的变量&#xff1a;堆区&#xff1b; 全局变量和静态变…

Python图形界面开发:Tkinter与PyQt

Python是一种非常流行的编程语言&#xff0c;它拥有丰富的图形用户界面&#xff08;GUI&#xff09;开发库。其中&#xff0c;Tkinter和PyQt是最常用的两个库。下面是对这两个库的简单介绍。 1. Tkinter Tkinter是Python的标准图形用户界面库。它提供了一组简单的工具和函数&…

人工智能:现状与未来发展

人工智能&#xff08;Artificial Intelligence, AI&#xff09;作为一门前沿科技&#xff0c;近年来取得了长足的发展&#xff0c;给我们的生活带来了巨大的改变。目前&#xff0c;人工智能已经广泛应用于各个领域&#xff0c;不论是医疗、交通、金融还是教育等&#xff0c;都能…

Python从入门到精通秘籍二

Python速成,知识点超详细,跟着这个系列边输入边学习体会吧! 一、Python的标识符 在Python中,标识符是用来命名变量、函数、类、模块等的名称。下面是一些使用代码示例来详细说明Python的标识符的具体规则和用法: 1.标识符的命名规则: 可以包含字母(大小写)、数字和下…

433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)

这道题可以看成一个24叉树。 因为基因序列长度固定为8&#xff0c;且每个位置的字母固定是AGCT&#xff0c;可以选择改变的只有3个字母&#xff0c;所以一次最多24种情况。 然后检查变化后的结果是否存在bank中&#xff08;使用hashSet来存储&#xff09;&#xff0c;同时设置…

GO语言Context的作用

文章目录 Context为什么需要Context多任务超时例子Context结构 Context各种使用方法创建contextvalueCtxvalueCtx结构体WithValue cancelCtxcancelCtx结构体withCancel timerCtxWithDeadlineWithTimeout 总结 Context 为什么需要Context Go语言需要Context主要是为了在并发环…

初识C语言·内存函数

1 memcpy的使用和模拟实现 紧接字符串函数&#xff0c;出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的&#xff0c;而这个函数可以干strcpy一样的事&#xff0c;但是区别就是它碰到\0也会继续复制。 函数的头文件是string&#xff0c;返回类型是v…

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取&#xff0c;使用、在磁盘上存储和构建图像数据集有一些约定&#xff0c;以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…