GDI+使用步骤

2023-10-27

相比较GDI,GDI+增加了渐变的画刷,支持多种图像格式等,不过最大的变化,还是编程模型上的变化。

GDI+使用了面向对象的思想,对接口进行了类封装,使用更加方便。

在应用程序中使用GDI+库应该遵循一下步骤:

  1.引入Gdiplus.h头文件,加上:using namespace Gdiplus;这样使用GDI+中的任何东西就不需要重新指定命名空间了。

//引入gdi+头文件
	#include <GdiPlus.h>
	using namespace Gdiplus;

  2.链接DLL的导入库Gdiplus.lib。在VS中有两种方法,一是直接在项目属性->链接->输入中填入Gdiplus.lib;二是直接使用编译器原语:#pragma comment(lib, "Gdiplus.lib")

	//导入GDI+的库
	#pragma comment(lib, "Gdiplus.lib")

  3.在调用任何GDI+函数前一定要调用GDI+库初始化函数GdiplusStartup(),初始化GDI+库。

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
	//初始化gdi+
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

  4.在确定不需要使用任何GDI+函数并且所有GDI+对象均已销毁(变量超过了生存期),需要调用GDI+关闭函数GdiplusShutdown()。GDI+支持多线程,所以可以在任意一个线程中调用。

	//释放gdi+
	GdiplusShutdown(gdiplusToken);
5.在需要绘制的地方尽情的使用GDI+吧

CClientDC dc(this);
	//使用gdi+
	Graphics graphics(dc.GetSafeHdc());
	Image image(L"res/meinv.jpg");
	
	MoveWindow(0, 0, image.GetWidth(), image.GetHeight(), TRUE);
	graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());

GDI+新特性

  GDI+与GDI相比,增加了下列新的特性:

  1、渐变画刷

  以往GDI实现颜色渐变区域的方法是通过使用不同颜色的线条来填充一个裁剪区域而达到的。现在GDI+拓展了GDI功能,提供线型渐变和路径渐变画刷来填充一个图形、路径和区域,甚至也可用来绘制直线、曲线等。这里的路径可以视为由各种绘图函数产生的轨迹。

  2、样条曲线

  对于曲线而言,最具实际意义的莫过于样条曲线。样条曲线是在生产实践的基础上产生和发展起来的。模线间的设计人员在绘制模线时,先按给定的数据将型值点准确地"点"到图板上。然后,采用一种称为"样条"的工具(一根富有弹性的有机玻璃条或木条),用压铁强迫它通过这些型值点,再适当调整这些压铁,让样条的形态发生变化,直至取得合适的形状,才沿着样条画出所需的曲线。如果我们把样条看成弹性细梁,那么压铁就可看成作用在这梁上的某些点上的集中力。GDI+的Graphics:: DrawCurve函数中就有一个这样的参数用来调整集中力的大小。除了样条曲线外,GDI+还支持原来GDI中的Bezier曲线。

  3、持久的路径对象

  我们知道,在GDI中,路径是隶属于一个设备环境(上下文),也就是说一旦设备环境指针超过它的有效期,路径也会被删除。而GDI+是使用Graphics对象来进行绘图操作,并将路径操作从Graphics对象分离出来,提供一个GraphicsPath类供用户使用。这就是说,我们不必担心路径对象会受到Graphics对象操作的影响,从而可以使用同一个路径对象进行多次的路径绘制操作。

  4、矩阵和矩阵变换

  在图形处理过程中常需要对其几何信息进行变换以便产生复杂的新图形,矩阵是这种图形几何变换最常用的方法。为了满足人们对图形变换的需求,GDI+提供了功能强大的Matrix类来实现矩阵的旋转、错切、平移、比例等变换操作,并且GDI+还支持Graphics图形和区域(Region)的矩阵变换。

  5、Alpha混色

  在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。

  Alpha混色是将源像素和背景像素的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示:
显示颜色 = 源像素颜色 X alpha /255 + 背景颜色 X (255 -alpha) / 255

  GDI+的Color类定义了ARGB颜色数据类型,从而可以通过调整Alpha值来改变线条、图像等与背景色混合后的实际效果。

  除了上述新特性外,GDI+还将支持重新着色、色彩修正、消除走样、元数据以及Graphics容器等特性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDI+使用步骤 的相关文章

  • 双线性插值 - DirectX 与 GDI+

    我有一个 C 应用程序 我为其编写了 GDI 代码 该代码使用 Bitmap TextureBrush 渲染来呈现 2D 图像 可以应用各种图像处理函数 该代码是应用程序中模仿现有 DX9 代码的新路径 它们共享一个公共库来执行所有向量和矩
  • 位图.保存“一般错误”

    当我运行我的应用程序时 出现以下错误 GDI 中发生一般错误 我环顾四周 发现人们也有类似的错误 但没有找到真正的解决方案 或者实施起来确实很痛苦 那些没有得到解决方案的人还没有发布他们的代码 所以我想我不妨尝试一下并提出另一个关于如何修复
  • GraphicsPath 和 OutOfMemoryException

    我有以下内容 private bool IsPathVisible Rectangle detectorRectangle GraphicsPath path Pen pen path Widen pen return IsPathVisi
  • 创建DIBection失败

    BITMAPINFO bmi memset bmi 0 sizeof BITMAPINFO bmi bmiHeader biSize sizeof BITMAPINFOHEADER bmi bmiHeader biWidth m pImg
  • 在 3D 空间中旋转图像的一部分

    设置如下 这是一个电子商务艺术网站 其中一些绘画是画布转移 这幅画环绕画布的侧面 顶部和底部 我们拥有整幅画的高分辨率图像 但我们想要显示的是图像的准 3D 表示 您可以在其中看到画作的侧面如何环绕画布 这是我正在谈论的内容的粗略草图 我的
  • 测量缠绕的绳子

    我正在尝试创建一个控件 它基本上允许我在彼此下面绘制不同的字符串 但是 字符串的宽度不能大于控件的宽度 为了解决这个问题 我正在考虑将 RectangleF 对象传递给 Graphics DrawString 方法 这将包装比传递的矩形宽度
  • 使用 GDI+ 和 C# 更改图像对比度

    我的问题如下 我正在制作一个程序 可以通过 C 代码操纵亮度 伽玛和对比度 对于亮度和伽玛来说还可以 我已经通过在网上找到的代码实现了它 但我不能进行对比 到目前为止我唯一发现的是CalculateRamp方法 其输入参数 double l
  • Delphi/GDI+:设备上下文何时创建/销毁?

    通常在 Delphi 中使用 GDI 你可以使用绘画盒 并在期间进行绘画OnPaint event procedure TForm1 PaintBox1Paint Sender TObject var g TGPGraphics begin
  • C# 上的 DrawString 文本太粗体

    我已经使用GDIDrawString绘制文本的方法 当程序运行时 屏幕上的文字看起来很好 但是一旦我将文件保存到图像中 字体就会比以前更粗 正常的会加粗 加粗的会更加粗 这该如何处理呢 public override void DrawTo
  • 在 C# 中使用 ImageAttributes 旋转色调

    如何使用 GDI 旋转图像的色调ImageAttributes 并且大概ColorMatrix 请注意 我想旋转色调 而不是对图像进行着色 EDIT 通过旋转色调 我的意思是图像中的每种颜色应该转换为不同的颜色 而不是使整个图像变成一种颜色
  • 为什么后台线程中的图形操作会阻塞主 UI 线程中的图形操作?

    我有一个后台线程正在给定文件夹中创建图像的灰度缩略图 我看到的问题是后台线程中的 Graphics DrawImage 调用似乎以某种方式阻止了主 UI 线程上的 Graphics 操作 我可能会误解我在这里看到的内容 并且直到今晚晚些时候
  • Windows 7 中一个进程的 GDI 对象上限是多少?

    有一个存在 GDI 泄漏的应用程序 最终会达到 10 000 个分配的 GDI 对象并崩溃 我尝试增加GDI进程句柄配额 http msdn microsoft com en us library windows desktop ms724
  • 在 C# 中,如何在不使用 Bitmap.MakeTransparent() 的情况下将图像设置为透明背景?

    我想将图像设置为具有透明背景 但我不想用透明度替换特定颜色的所有像素 更具体地说 该图像是通过 IShellItemImageFactory GetImage 获取的文件夹的缩略图 这给了我一个位图 如 Windows 资源管理器缩略图视图
  • C# - Windows 窗体应用程序位图 SetPixel 和 GetPixel 的更快替代方案

    我正在尝试自学 C 并且从各种来源听说函数 get 和 setpixel 可能非常慢 有哪些替代方案 性能改进真的那么显着吗 我的一段代码供参考 public static Bitmap Paint Bitmap b Color f Bit
  • 如何检测并突出显示鼠标悬停时的矩形

    我在 C net 中创建了一个 Windows 应用程序控件 以图形模式显示一些对象 为此 我根据列表中的项目数量创建了一个矩形 并使用 Control OnPaint 事件将其绘制在控件上 现在 如果鼠标悬停在该矩形上 我想突出显示该矩形
  • 如何将透明光标渲染到位图并保留 alpha 通道?

    我使用下面的代码来渲染透明图标 private void button1 Click object sender EventArgs e using LoadCursorFromFile from user32 dll var cursor
  • bitblt 在 Windows 10 版本 1703 上失败 (15063.138)

    使用 Visual Studio 2017 vc141 以下代码应该从前游戏窗口获取屏幕截图 但现在它返回黑色和空白图像 唯一的游戏问题 尝试过 OpenGL 和 Vulkan ogl 返回黑色 vulkan 返回白色 在升级到 Windo
  • 使用 GDI+ 使用不同颜色绘制线条的快速方法?

    我有一个动态的点列表 可以随时添加新点 我想用不同的颜色画线来连接它们 颜色基于这些点的索引 这是代码 private List
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • Windows API 中逻辑坐标和设备坐标之间的混淆

    我一直在研究一个使用两个函数的 Visual Studio C Windows 应用程序项目SetWindowExt and SetViewportExt 我对这两个函数的作用以及为什么它们是必要的感到困惑 搜索这些函数 我得出了逻辑坐标和

随机推荐

  • APP过度索取问题严重,该如何有效解决?

    近几年移动应用市场发展快速 APP种类功能繁多 给人们的生活和工作带来了无限便捷 然而事物的发展必然有对立面 APP获取用户数据问题突出 同时加大了信息泄露的风险 工信部及各通信管理局等相关部门针对APP问题频频通报 使得移动应用开发商处于
  • 封闭岛屿数量 -- 二维矩阵的dfs算法

    1254 统计封闭岛屿的数目 这道题和 岛屿数量 二维矩阵的dfs算法 类似 区别在于不算边缘部分的岛屿 那其实很简单 把上 题中那些靠边的岛屿排除掉 剩下的就是 封闭岛屿 了 关于岛屿的相似题目 岛屿数量 二维矩阵的dfs算法 封闭岛屿数
  • openEuler 22.03-LTS 基础配置

    文章目录 1 设置语言环境 1 1 显示当前语言环境状态 1 2 列出可用的语言环境 1 3 设置语言环境 2 设置键盘 2 1 显示当前设置 2 2 列出可用的键盘布局 2 3 设置键盘布局 3 设置日期和时间 3 1 使用timedat
  • 聚合工程是什么?与微服务有什么区别和联系?

    1 聚合的概念 把项目的各个模块 子工程 聚合在一起构建 一般用于分模块开发 最后整体打包发布 Maven Project独立运行 Maven Module无法独立运行 2 聚合工程开发步骤 1 根项目是一个pom项目 2 子模块 Mave
  • Eigen 简单矩阵运算

    用到 Eigen Core 和 Eigen Dense 模块 矩阵定义 Eigen Matrix lt 数据类型 行数 列数 gt 矩阵名称 已经提供的矩阵类型 Vector3d 向量名称 实质上是 Eigen Matrix
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • pandas简单学习(Spyder)

    1 导入Excel文件 data pd read excel D 下载 PlayTennis xlsx 2 查看数据维度 data7 data shape 3 查看数据类型 type data 4 索引 索引某一列 data1 data D
  • Linux之——添加VIP

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net l1028386804 article details 81347068 转载请注明出处 https blog csdn net l10283868
  • 使用VNA(Vector Network Analyzer)对S参数进行去嵌(二)

    使用VNA Vector Network Analyzer 对S参数进行去嵌 一 小孟boy的博客 CSDN博客 vna测s11公式 去嵌过程 无论是使用 EM 仿真工具创建的简化模型 如一段理想传输线 还是复杂模型用于测试夹具 现在都需要
  • Check failed: registry.count(type) == 1 (0 vs. 1) Unknown solver type: SGD (known types: )

    问题 在xcode下面编译调试caffe cpp时出现 Check failed registry count type 1 0 vs 1 Unknown solver type SGD known types 解决方法 在caffe cp
  • 4PCS、super4PCS粗配准算法理解

    参考了泡泡点云时空的文章4PCS点云粗配准算法介绍 一 4PCS系列的点云配准方法有点类似Ransac 通过找出目标点云和带配准点云中对应的两组点进行旋转平移求解出T 然后在众多的候选T中旋转一组最大重合的T 只是怎么找出对应点方法不一样
  • 关于深度学习中迭代次数iter和epoch等的关系

    1 在深度学习的训练中 epoch指的是所有的数据遍历了几次 而iter指的是整个batchsize输入到网络多少次 如果非得说关系 那 iter batchsize sum photos epoch
  • arch linux 安装教程(包括安装桌面环境,以及一些常用软件,输入法,网易云 等)

    2019 11 03添加 官方关于base组内所删除的包组情况 详细信息参照 wiki archlinux org 关于启动盘制作可以看 windows下安装grub2 可制作多功能U盘 和 grub2各种手动命令引导教程 这两篇文章 说明
  • java中执行js代码块_在Java中执行js代码

    Performance Monitor2 Peformance Counter Performance Counter 是量化系统状态或活动的一个数值 Windows Performance Monitor在一定时间间隔内 默认的取样间隔是
  • 使用timerfd实现定时器功能

    依旧以muduo为例 使用timerfd可以使用与socketfd类型相同的方式在IO复用中使用 使用timerfd create 创建一个timerfd 接着使用timerfd settime 设置定时器的到期时间 我们只需要注册time
  • 基于streamlit的表格展示-完美解决方案

    问题 用streamlit开发web app非常实用 但是streamlit的表格展示非常不友好 只有两个简单的接口函数 st table df 和st dataframe df 对于字段稍微比较多的dataframe显示效果相当不友好 s
  • linux安装中文、中文输入法以及火狐浏览器中文

    emm 今天突然想用下linux版本的web项目 发现进入浏览器后无法输入中文 鹅且也不知道中文输入法的入口 OTZ 摸索了一会 整理出来分享下 这里是分割线 啦啦啦啦 第一步 设置中文 话不多说直接看图 保存好 退出终端 重启系统 界面啥
  • 报错 LINK : fatal error LNK1181: 无法打开输入文件“cxcore.lib”

    转自 http www cnblogs com lxt287994374 archive 2012 11 23 2785274 html vs2010报错 1 gt LINK fatal error LNK1181 无法打开输入文件 cxc
  • C++头文件容器库——vector

    vector的使用 首先添加头文件 include
  • GDI+使用步骤

    相比较GDI GDI 增加了渐变的画刷 支持多种图像格式等 不过最大的变化 还是编程模型上的变化 GDI 使用了面向对象的思想 对接口进行了类封装 使用更加方便 在应用程序中使用GDI 库应该遵循一下步骤 1 引入Gdiplus h头文件