GDI+笔记

Grapgics 对象是Gdi+的核心,Gdi+中使用的是非状态模型编程。
注意在开始调用GDI+的各种函数之前,应该使用 GdiplusStartup 函数对GDI+系统资源进行初始化
在结束GDI+调用之前,应该使用 GdiplusShutdown 函数对GDI+系统资源的销毁操作。


GDIplus.h是GDI+程序开发的基础,在GDI+中,字符使用双字节的UNICODE方式来表示,UNICODE主要使用


的字符类型是 WCHAR ,定义是 unsigned short.


TCHAR类型
当定义了_UNICODE宏时,TCHAR就是WCHAR,没有这个宏时TCHAR就是char;
在UNICODE方式中需要为一个字符串常量赋值时,可以使用L宏,如 BSTR wcsStr = L"unicode" ;




2.5.1 构造 Grapgics对象
Grapgics是GDI+程序设计的核心,有如下构造函数:
static Grapgics* FromHDC(HDC hdc); //hdc:设备环境句柄
static Grapgics* FromHDC(HDC hdc,HANDLE hDevice); // Hdevice:设备句柄 
static Grapgics* FromHDC(HWND hWnd, Bool icm); //hWnd;窗口句柄 , icm:是否使用色彩


配置文件校正色彩
static Grapgics* FromHDC(Image*  image); //image: 图像对象


Grapgics类的不同构造函数表明了对应的创建环境。如果指定从窗口句柄创建Grapgics对象,那么绘图


平面就是窗口,如果指定了图片作为Grapgics类,绘图平面就是图片。
















1.绘制直线
DrawLine(Pen *pen,Point& pt1,Point& pt2); pt2:线段起止点位置
DrawLine(Pen *pen,PointF& pt1,PointF& pt2);
DrawLine(Pen *pen,INT x1,INT y1,INT x2 ,INT y2); X1,Y1,X2,Y2:线段起止点坐标
DrawLines(Pen *pen,Point* points , INT count); points:直线端点数组
DrawLines(Pen *pen,PointF* points , INT count);count:线段定义点总数




2.绘制矩形
DrawRectangle(Pen* pen,Rect& rect); //rect:矩形区间
DrawRectangle(Pen* pen,INT x,INT y,INT width,INT height); 
更画直线一样,GDI+提供一次绘制多个矩形的函数,如下:
DrawRectangles(Pen* pen,Rect*  rects, INT count)


例子;
Rect rect1(10.0f,10.0f,100.0f,50.0f);
Rect rect2(10.0f,10.0f,100.0f,50.0f);
Rect rects[] ={rect1, rect2};
Rect* pRects = rects;
Grapgics.DrawRectangles(&blackPen, pRects,3);




3.绘制曲线和贝塞尔曲线
GDI+提供了 DrawCurve 和 DrawClosedCurve(封闭曲线),使用方法相同,但是封闭曲线如果给出的首位


点不重合,会自动光滑连接首尾点


DrawCurve(Pen* pen, Point* points, INT count); points,count :定义曲线的点及点的个数
DrawCurve(Pen* pen, Point* points, INT count,REAL tension); tension:曲线的弯曲强度,


贝塞尔曲线最初用于汽车工业设计,现在在计算机辅助设计CAD,TrueType字体的定义都有广泛运用,在


计算机图像中仅次于 直线和椭圆弧线。
用4个点来指定的曲线:2个端点和2个控制点,曲线连接2个端点,不通过控制点,控制点的位置控制曲


线的弯曲方向,控制点的行为像磁铁一样将曲线推向某个方向,并影响曲线的弯曲方向。


myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);
它的起点为(0,0),控制点为(40,20)和(80,150),终点为(100,10)。


多边形:
DrawPolygon(Pen* pen , Point* points, INT count);






2.5.4 色彩
GDI+有2种色彩表述方式:RGB和CYMK
GDI+中对色彩添加了透明度支持,透明度是像素之间的一种合成运算:
输出色彩 = 前景色 X 透明度 /255  + 背景色 X (255 - 背景色) /255 




5.绘制几何图形
DrawArc(Pen* pen, Rect& rect ,REAL satrAngle, REAL sweepAngle);
DrawArc(Pen* pen, INT x,INT y, INT width ,INT height ,REAL sweepAngle, REAL sweepAngle);
rect;定义弧线的矩形
satrAngle:从x轴到弧线的起始点沿顺时针方向度量的角度
sweepAngle: 从satrAngle参数到弧线的结束沿顺时针方向度量的角度。














2.5.3 填充区域
FillClosedCurve 填充封闭曲线
FillEllipes 填充椭圆
FillPath 填充路径
FillPie 填充扇形
FillPolygon 填充多边形
FillRectangle 填充矩形
FillRectangles 填充矩形集合
FillRegion 填充区域


这些函数都: 先构造画刷,后进行区域填充。
画刷有5种:单色画刷,影线画刷,纹理画刷,线性渐变画刷,路径渐变画刷。






2.5.5 输出文本
Graphics类通过DrawString函数来完成丰富的文本输出效果
DrawString(string,length,font,layoutRect,StringFormt,brush);
DrawString(string, length,Font,origin,brush);
DrawString(String,length,font,origin,syringFormat,brush);
string:双字节文本
layoutRect,origin:文本输出的位置
stringFormar:文本输出格式
Brush:输出文本时锁使用的画刷






第三章 画笔和画刷


3.1 画笔用于描绘图形轮廓。GDI+画笔除了具有色彩和宽度属性之外,还添加其他属性,如对其方


式,线帽及变换方式等


Pen类构造函数如下:
Pen(color,width); //构造一个宽度为width,色彩为color的画笔
Pen(Color(255,255,0,0),4.0f);
Pen(brush,width); //指定画刷构造一个指定宽度的画笔


成员函数 SetDashStyle(DashStyle)可以设置画笔线型,DashStyle枚举如下
enum DashStyle{
DashStyleSolid =0, //实线
DashStyleDash =1, //虚线
DashStyleDot =2, //点线
DashStyleDashDot =3, //点划线
DashStyleDashDotDot =4, //双点划线
DashStyleCustom =1 //自定义线型
};


成员函数 SetAligoment(PenAligonment);可以设置画笔对其方式,PenAligonment枚举如下
enum PenAligonment{
PenAligonmentCenter =0, //居中
PenAligonmentInset =1, //嵌入
};


3.1.3 画笔的缩放及旋转
成员函数 ScaleTransform(Matrix&) ;缩放变换,使用方法:
Matrix matrix(1,0,0,2,0,0);
pen.ScaleTransform(&matrix)


成员函数 pen.SetLineJoin(LineJoinRound); 设置连接点方式.有4种,在LineJoin枚举中:
enum LineJoin{
LineJoinMiter =0,
LineJoinBevel =1,
LineJoinRound =2,
LineJoinMiterClipped =3
};


画笔的透明度,是相对于背景色而言的,线条透明度越大,背景的可见度就越大。




3.2 使用画刷
SolidBrush //单色画刷,填充图案
HatchBrush //影线画刷,用各种线形图案填充图形
TextureBrush //纹理画刷,使用基于光栅的图案填充图形
LinearGradientBrush //线形渐变画刷,
PathGradientBrush //路径渐变画刷


单色画刷: SolidBrush shua(Color(255,0,255,0));
GraphicsPath tmpth(FillModeAltemate); 创建一个图形路径对象


影线画刷:HatchBrush(HatchStyle haichstyle,const Color& foreColor,const Color& backColor);
haichstyle:影线画刷类型,foreColor:前景色,backColor:背景色


纹理画刷的作用实际上就是讲图片在目标区域平铺;
TextureBrush(Image* image,Rect& dsRect,ImageAttributes* imageAttributes)
TextureBrush(image,wrapMode)
TextureBrush(Image* image,WrapMode wrapMode,Rect& dsRect)
dstRect;指定图案用于画刷中的矩形区域,大小不能超过图案的范围
wrapMode:指定画刷如何排列图案


1.纹理画刷的排列方式,既可以在TextureBrush画刷的构造函数中指定,也可以SetWrapMode()函数修改
enum WrapMode{
WrapModeTile, //图片平铺
WrapModeTileFlipX, //水平向上翻转并平铺
WrapModeTileFlipY, //垂直向上翻转
WrapModeTileFlipXY, //水平和垂直方向上同时翻转
WrapModeClamp //不平铺
};


纹理画刷的变换,程序中多次使用ResetTransform重置纹理画刷,是因为这3种变换是可以叠加的.
RotateTransform(30) //将画刷旋转30度
ResetTransform() //重置之前的变换
ScaleTransform(3.1) //将画刷在水平方向扩大3倍
TranslateTransform(30,0,MatrixOrderAppend) //将画刷在水平方向平移30个像素








3.2.4 线性渐变画刷
线性渐变画刷可以使双色渐变,也可以是多色的.
LinearGradientBrush(Point& point1,Point% point2, Color& color1, Color& color2)
LinearGradientBrush(Rect& rect,Color& color1,Color& color2,REAL angle,BOOL isAngleScalable)
color1,color2:起点,终点颜色
point1,poinr2:起点,终点坐标
isAngleScalable:画刷是否旋转
Angle;旋转角度
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值