作为GDI的升级版,GDI+引入了很多重量级的概念和新功能,大家可以下载或者查看相关的GDI+的教程
这一节,我们就简单的介绍一下GDI+的Image部分,通过Image我们简单的实现图片操作的基本功能,如下图
本次代码中,我们将简单的实现图片的缩放,旋转,保存,后期慢慢补充特效的制作
本例代码窗口的创建采用第二章的SkinUI搭建,关于怎么实现此窗口就不说了!详细请参照第二章《控件应用》
先说一下GDI+的初始化
包含头文件和库文件
1
2
3
4
|
#include
using
namespace
Gdiplus;
#pragma comment(lib,"Gdiplus.lib")
|
这里注意一下,如果你是vc6编译器,请自行下载Gdiplus的SDK,其他版本的vs不需要单独下载
声明Gdiplus的变量
1
|
ULONG_PTR
m_GdiplusToken;
|
进行GDI+的初始化,一般在InitInstance进行
1
2
|
GdiplusStartupInput input;
GdiplusStartup(&m_GdiplusToken,&input,NULL);
|
最后卸载GDI+资源,一般在ExitInstance中进行
1
|
GdiplusShutdown(m_GdiplusToken);
|
ps:以上初始化代码最好在程序的入口函数处进行,很多朋友喜欢在封装GDI+类的时候,喜欢在封装类中的构造函数里进行GDI+资源的初始化,其实没有这个必要,重复的加载虽然不会导致内存的增长,最好还是只初始化一遍为好。
关于缩放,旋转,平移等操作,这里需要介绍一个概念,矩阵Matrix,如果你接触过DirectX,那你对这个肯定是熟悉的不能再熟悉,但是这里需要区分以下,毕竟GDI+是2D的,所以处理的维数没有3D那么多,其次,关于矩阵需要一定的数学基础。
通过Matrix,我们可以轻松的实现图像的各种操作,平移,缩放,旋转等,我们先来看一下矩阵是怎么影响变换的。
比如在X轴对图像进行平移
X(视图矩阵) = X(世界矩阵)+ X平移量
类似的,关于缩放
X(视图矩阵) = X(世界矩阵)* 缩放比
而旋转会变得复杂一些
X(视图矩阵) = X(世界矩阵)* cos(旋转角度) + Y(世界矩阵)* sin(旋转角度)
Y(视图矩阵) = X(世界矩阵)* sin(旋转角度) + Y(世界矩阵)* cos(旋转角度)
当然累积变换会变的异常的麻烦,它涉及到这些公式的组合计算,不过使用矩阵代数来处理会变得非常的简单!
我们先来省略矩阵公式的数学推导,我们可以使用如下表达式来表示这种情况。它表示了如何应用矩阵乘法来计算一个点相对初始坐标的最后的、经过变换的X、Y坐标
这里,X0和Y0表示了初始坐标,3×3的矩形包含了执行一次通用变换所需的全部信息,Xt和Yt表示了变换后的页坐标
注意:这里我们使用了矩阵乘法。在矩阵乘法中,计算Xt的公式为Xt=(X0×L1)+(X×L3)+(X0×T1),Yt通过涉及矩阵第2列的一个相似的公式来计算,结果中的第3个坐标1通过矩阵的第3列来计算
在矩阵中,变量L表示变换的线性部分(合并缩放和旋转所需的信息)而变量T1包含了一次平移所需的所有信息。注意,3×1矩阵的1是一个哑元坐标,它使平移组件能够被包含在一个矩阵中。因为在GDI+中,我们感兴趣的只是矩阵变换,所以第三列包含了数字[0 0 1]