GDI+ 简介:
GDI (Graphics Device Interface,图形设备接口),Windows 为图像绘制上提供的一组API接口。
GDI+ 是GDI的优化版本,对开发者的易用性更好。
使用方法:
/*GDI+ 头文件*/
#include <objidl.h>
#include <gdiplus.h>
/*系统以GdiPlus。dll 方式提供,需保护lib静态文件*/
using namespace GdiPlus;
#pragma Comment(lib,"Gdiplus.lib")
//或者
/*头文件已经包含了两个文件,并且链接了Gdiplus.lib静态文件*/
#include <atlimage.h>
using namespace Gdiplus;
/*使用GDI 必须先初始化*/
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
..........
..........
..........
//程序结束后关闭GDI+
GdiplusShutdown(gdiplusToken);
Graphics类
Graphics类 是GDI+ API中的核心类,它提供了绘制直线,曲线,图像,图像和字符串的诸多成员函数。
Graphics类 一般情况下需要配合Pen、Foint、SoildBrush等类使用。
void Graphics(IN HDC hdc)
通过一个设备上下文来构造,用于在窗口绘图
void Graphics(IN Image* image)
通过一个Image类对象来构造,用于绘制图像
Graphics 类中的绘图函数:
成员函数 | 函数功能 |
---|---|
DrawLine | 画先函数 |
DrawLines | 画折线函数 |
DrawRectangle | 画折矩形 |
DrawRectangles | 画多个矩形 |
DrawEllipse | 画椭圆形 |
DrawArc | 画圆弧 |
DrawString | 画字符串 |
DrawPolygon | 画封闭的多边形区域 |
DrawPie | 画饼状图 |
FillRectangle | 填充矩形区域 |
FillEllipse | 填充椭圆 |
FillPolygon | 填充多边形 |
MeasureString | 测量字符串高度宽度 |
DrawIamge | 画图片(PNG,BMPJPG) |
TranslateTransform | 平移变换 |
ResetTransfrom | 取消变换 |
ScaleTransform | 缩放变换 |
RotateTransform | 旋转变换 |
Graphics类 画实线
//画笔确定颜色与粗细 两点确定一条线
//画直线函数
Status DrawLine(IN const Pen* pen, //画笔对象
IN REAL x1, // 起点X坐标
IN REAL y1, // 起点Y坐标
IN REAL x2, // 终点X坐标
IN REAL y2) // 终点Y坐标
//画折线函数
//多个点确认折线线
Status DrawLines(IN const Pen* pen, //画笔对象
IN const Point* points, //坐标数组
IN INT count) //坐标数组的长度
//pen 对象
//pen类是GDI+的画笔类
Pen(IN const Color& color, IN REAL width = 1.0f);
/*通过一个颜色和宽度指定一个画笔*/
Pen(IN const Brush* brush, IN REAL width = 1.0f);
/*通过一个画刷和宽度知道一个画笔*/
//Color 颜色类
Color(IN BYTE r,IN BYTE g,IN BYTE b;
/*通过,R值,G值,B值指定一个颜色*/
Color(IN BYTE a, IN BYTE r, IN BYTE g,IN BYTE b);
/*通过一个透明度,R值,G值,B值指定一个颜色*/
//PointF类
Pointf(REAL x,REAL y);
/*通过x,y值构造一个坐标点*/
Pointf(const SizeF &size)
/*通过SizeF值构造一个坐标点*/
//Status类
enum Status
{
OK,
GenericError,
InvalidParameter,
OutOfMemory,
ObjectBusy,
InsufficientBuffer,
NotImplemented,
......
ProfileNotFound
};
Graphics类 画虚线 画箭头线
- 画虚线
Pen类提供SetDashStyle 成员方法函数来设置画笔样式
Status SetDashStyle(IN DashStyle dasgStyle);
enum DashStyle
{
DashStyleSolid, //实线
DashStyleDash, //由划线段组成的直线
DashStyleDot, //由点构成的直线
DashStyleDashDot, //划线点构成的直线
DashStyleDashDotDot, //划线点点图案构成直线
DashStyleCustom //自定义
};
- 画带箭头的线
Pen类的SetStartCap和SetEndCap方法指定线条末端的表现形式;线帽可以为扁平、方块、圆角、三角或者用户定义形状
//设置线起点
Status SetStartCap(IN LineCap startCap)
//设置线终点
Status SetEndCap(IN LineCap endCap);
//设置线中间
Status SetDashCap(IN DashCap dashCap);
enum LineCap
{
LineCapFlat = 0,
LineCapSquare = 1,
LineCapRound = 2,
LineCapTriangle = 3,
LineCapNoAnchor = 0x10, //无
LineCapSquareAnchor = 0x11, //正方形
LineCapRounAnchor = 0x12 //圆角
LineCapDiamondAnchor = 0x13, //钻石
LineCapArrowAnchor = 0x14, //箭头
LineCapCustom = 0xff, custom cap
LineCapAnchorMask = 0xf0
};
enum DashCap
{
DashCapFlat = 0, //无
DashCapRound = 2, //圆角
DashCapTriangle = 3 //三角
};
Graphics类 画矩形
- 画矩形
//画笔确定粗细与颜色,两点 + 长宽确定矩形
Status DrawRectangle(IN const Pen *pen, //画笔对象
IN REAL x, //起点x坐标
IN REAL y, //起点y坐标
IN REAL width, //宽
IN REAL height //高
);
画笔确定粗细与颜色,矩形坐标确定形状
Status DrawRectangle(IN const Pen *pen, //画笔对象
IN const Rect & rect //矩形坐标
);
- 画多个矩形
Status DrawRectangles(IN const Pen *pen, //画笔对象
IN const Rect & rects, //矩形坐标数组
IN INT count // 矩形个数 );
- Rect 类
class Rect
{
.....
INt X; //起点x坐标
INT Y; //起点y坐标
INT Width; //宽
INT Height; //高
}
Graphics类 画圆形、圆弧
- 画圆形
//画笔确定颜色与粗细,外切圆坐标确定椭圆
Status DrawEllipse(
IN const Pen *pen, //画笔对象
IN REAL x, //起点x坐标
IN REAL y, //起点y坐标
IN REAL width, //宽
IN REAL height //高
);
//画笔确定颜色与粗细,外切圆坐标确定椭圆
Status DrawEllipse(
IN const Pen *pen, //画笔对象
IN Rect & rect //矩形坐标
);
- 画圆弧
//画笔确定颜色与粗细,外切矩形确定椭圆
Status DrawArc(
IN const Pen *pen, //画笔对象
IN REAL x, //起点x坐标
IN REAL y, //起点y坐标
IN REAL width, //宽
IN REAL height, //高
IN REAL startAngle, //开始角度
IN REAL sweepAngle //圆弧角度
)
//画笔确定颜色与粗细,外切矩形与角度决定圆弧
Status DrawArc(
IN const Pen *pen, //画笔对象
IN const Rect &rect, //内接矩形
IN REAL startAngle, //开始角度
IN REAL sweepAngle //圆弧角度
)
Graphics类 消除锯齿
-
消除锯齿
Graphics 类的成员函数提供反锯齿功能
Status SetSmoothingMode(
IN SmoothingMode smoothingMode //平滑模式
) -
SmoothingMode 类型
enum SmoothingMode
{
SmoothingModeInvalid = QualityModeInvalid, //无效模式
SmoothingModeDefault = QualityModeDefault, //默认
SmoothingModeHighspeed = QualityModeLow, //高速度,低质量
SmoothingModeHightQuality = QualityModeHight, //高质量,低速度
SmoothingModeNone, //不消除
SmoothingModeAntiAlias, //消除锯齿
}
Graphics类 画多边形
- 绘制多边形
//画笔确定颜色与粗细,多个点连接起来形成多边形
Status DrawPolygon(
IN const Pen *pen, //画笔
IN const PointF *points, //点的数组
IN INT count //点的个数
);
- 填充多边形
//画刷确定填充颜色,多个点连起来形成多边形
Status FillPolygon(
IN Brush *brush, //画刷
IN const PointF *points, //点的数组
IN INT count //点的个数
)
Graphics类 画饼图
- 绘制饼图
//画笔确定颜色与粗细,外切矩形确定圆,开始与角度确定饼图
Status DrawPie(
IN const Pen *pen, //画笔对象
IN const RectF &rect, //圆的外接矩形
IN REAL startAngle, //开始角度
IN REAL sweepAngle //旋转角度
)
- 填充饼图
//画刷确定填充颜色,多个点连起来形成多边形
Status FillPie(
IN const Brush *brush, //画刷
IN const RectF & rect, //圆的外接矩形
IN REAL startAngle, //开始的角度
IN REAL sweepAngle //旋转角度
)
使用纯色画刷填充图形
- Brush 类
Brush类是定义画刷的抽象基类。画刷对象用于填充图形(矩形,椭圆形,饼图等…)
-
SolidBrush 类
SolidBrush 类定义一个纯色画刷,继承自Brush类,用于填充图形形状内部,使用一个颜色构造画刷 -
填充矩形
//画刷填充颜色,矩形确定位置
Status FillRecangle
{
IN const Brush *brush, //画刷
IN const RectF &rect, 矩形
};
- 填充椭圆
//画刷填充颜色,外切矩形确定填充椭圆位置
Status FillEllipse(
IN const Brush *brush, //画刷
IN const RectF &rect
);
- 填充多边形
//画刷填充颜色,多个点连起来形成多边形
Status FillPolygon(
IN const Brush *brush, //画刷
IN const PointF *POINTS, //点的数组
IN INT count //点的个数
)
使用渐变色画刷填充
- LinearGradientBrush 类
LinearGradientBrush 类 定义一个绘制颜色渐变的画笔
- LinearGradientBrush 构造
//起点,终点,起点颜色,终点颜色
LinearGradientBrush(Point &,Point &,Color &,Color&);
LinearGradientBrush (
IN const Rect &rect, //矩形左上角决定起点,右下角决定终点
IN const Color &color1,//起点颜色
IN const Color &color2,//终点颜色
IN REAL angle, //角度
IN BOOL isAngleScalable //指定角度是否伸缩
);
Graphics类绘制文字
- 绘制文字
//画刷确定颜色,Font 确定字体,矩形确定范围
Status DrawString(
IN const WCHAR *string, //文本
IN INT length, //文本长度
IN const Font *font, //字体对象
IN const PointF &origin, //文字起始点
IN const Brush *brush //画刷对象
)
//画刷确定颜色,Font 确定字体,矩形确定范围
Status DrawString(
IN const WCHAR *string, //文本
IN INT length, //文本长度
IN const Font *font, //字体对象
IN const PointF &origin, //文字起始点
IN const StringFormat *stringFormat,//对齐方式
IN const Brush *brush //画刷对象
)
- Font 类
class Font : public GdiplusBase
{
public:
friend class Graphics;
Font(
IN const WCHAR * familyName, //字体名
IN REAL emSize, //字体大小
IN INT style = FontStyleRegular,
IN Unit unit = UnitPoint,
IN const FontCollection * fontCollection = NULL
);
Graphics类测量字符串
- 测量字符串
//画刷确定填充颜色,矩形确定填充位置
Status MeasureString(
IN const WCHAR *string, //测量的字符串
IN INT lenght, //字符串的长度
IN const Font *font, //字体
IN const PointF &origin,//起点坐标
OUT RectF *boundingBox //测量出来的边界
)
Graphics类绘制图片
- 绘制图片
将image对象绘制
Status DrawImage(
IN Image *image, //要绘制的图像对象
IN const PointF &point //绘制的左上角
)
```cpp
//将image对象绘制 x,y未绘制起点,width,height指定要绘制的高(可缩放图像)
Status Drawimage(
IN Image *image, //要绘制的图像对象
IN REAL x, //绘制的起点x坐标
IN REAL y, //绘制的起点y坐标
IN REAL width, //绘制的宽度
IN REAL height //绘制的高度
)
成员函数 | 函数功能 |
---|---|
FromFile | 通过一个文件创建Image对象 |
FromStream | 通过流创建image对象 |
GetHeight | 获取图像的高度 |
Getwidth | 获取图像的宽度 |
Save | 保存图片对象到文件 |
Graphics类裁剪与缩放图片
- 裁剪图片
//将image 对象的部分绘制到指定起始点区域
Status DrawImage(
IN Image *image, //要绘制的图像对象
IN INT x, //绘制到窗口的x坐标
IN INT y, //绘制到窗口的y坐标
IN INT srcx, //从原图像左上角起始x坐标开始截取
IN INT srcy, //从原图像左上角起始y坐标开
IN INT srcwidth, //截取的图像宽
IN INT srcheight, //截取的图像高
IN Unit srcUnit, //绘制图像的单位为像素
)
- 裁剪与缩放
Status DrawImage(
IN Image *image, //要绘制的图像对象
IN const Rect & destRect, //绘制到窗口的矩形区域
IN INT srcx, //从原图像左上角起始x坐标开始截取
IN INT srcy, //从原图像左上角起始y坐标开
IN INT srcwidth, //截取的图像宽
IN INT srcheight, //截取的图像高
IN Unit srcUnit, //绘制图像的单位为像素
)
)
Graphics类设置缩放插值算法
- 设置插值模式
设置此图像对象的插值模式,插值模式决定图像缩放或者旋转使用的算法。
Status SetinterpolationMode(
IN interpolationMode interpolationMode //插值模式
)
- 插值算法
//其中interpolationModeQualityBicubic 效果最好,对系统资源消耗也最大
enum InterpolationMode
{
InterpolationModeInvalid, //插值无效
InterpolationModeDefault, //指定默认模式
InterpolationModeLowQuality, //指定低质量插值法
InterpolationModeHeightQuality, //指定高质量插值法
InterpolationModeBilinear, //指定双线性插值法
InterpolationModeBilcubic, //指定双三次插值法
InterpolationModeNearestNeighthbor, //指定最临近插值法
InterpolationModeHightQualityBilinear, //指定高质量双线性插值法
InterpolationModeHightQualityBilcubic, //指定高质量双三次插值法
}
Graphics类旋转与扭曲图片
- 扭曲图片
//将image对象 通过指定原始图像的左上角,右下角和左下角的坐标可旋转、发射和扭曲图像
Status DrawImage(
IN Image *image, //要绘制的图像对象
IN const Point, //destPoints, //点的数组
IN count, //点数组个数
);
Graphics 进行平移变换
- 平移变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status TranslateTransform(
IN REAL dx, //平移的水平分量
IN REAL dy, //平移的垂直分量
IN MatrixOrder order = matrixOrderPrepend
)
- 重置平移变换
将世界转换矩阵设置单位矩阵,单位矩阵表示一种什么都不做的转换。
Status ResetTransform();
Graphics 进行缩放变换
- 缩放变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status ScaleTransform(
IN REAL sx, //平移的水平分量
IN REAL sy, //平移的垂直分量
IN MatrixOrder order = matrixOrderPrepend
)
Graphics 进行旋转变换
- 旋转变换
//使用自身和平移矩阵的乘积更改世界转换矩阵
Status RotateTransform(
IN REAL angle, //旋转角度
IN MatrixOrder order = matrixOrderPrepend
)
GDI+的双缓冲绘图
-
双缓冲技术
双缓冲原理可形象理解为:把电脑屏幕看作一块黑板,首先我们内存环境建立一个"虚拟"的黑板,然后在黑板上绘制复杂的图形,等图形全部绘制完成,一次性把黑板(内存中)绘制好的图形"拷贝"到电脑屏幕上,这样可以极大提高绘图速度。 -
双缓冲实现步骤
-
使用Bitmap创建一个内存位图,位图的大小与窗口区一致,方便拷贝,相当于GDI的CreateCompatbleBitmap。
-
使用Graphics::FormImage创建内存Graphics对象,相当于GDI的CreateCompatibleDC。
-
使用Graphics对象成员函数(DrawEllipse,DrawImage等)在内存位图上绘制各种图形
-
使用Drawimage将内存位图一次性绘制到窗口上
GDI+截取桌面图片
- 使用GDI+截屏
- 获取桌面的设备上下文
HDC hsrDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)
或:
HDC GetWindowDC(HWND hWnd) //句柄未NULL时表示全屏幕
- 创建一个与指定设备兼容的内存设备上下文环境
HDC = hMemDc = CreateCompatibleDC(hsrDC);
- 为内存兼容DC创建一个尺寸为屏幕大小的内存兼容位图。
//获取屏幕大小
int SX = GetSystemMetrics(SM_CXSCREEN);
int SY = GetSystemMetrics(SM_CYSCREEN)
HBITMAP hBitmap = CreateCompatibleBitmap(hsrDC,SX,SY);
- 将内存位图选入内存兼容DC中
SelectObject(hMemDc,hBitmap);
- 将窗口的DC的内容拷贝到内存兼容DC中去,图像自然就画到内存兼容位图上了
BitBlt(hMenDc,0,0,SX,SY,hsrDC,0,0,SRCCOPY);
- 将HBITMAP转换GDI+的位图Bitmap,并使用
Bitmap bmp(hBitmap,NULL);
代码工程: