×

关于GDI+的一些说明

Kalet Kalet 发表于2009-03-20 12:00:14 浏览196 评论0

抢沙发发表评论

2007年06月09日 星期六 17:00


关于GDI+的一些说明



一,直线,曲线和形状
DrawXXX和FillXXX
Lines 直线     Rectangles 矩形    Ellipses 椭圆(被展示于一个矩形当中,给出一个rect)
Arcs 弧(被展示一于一个矩形当中,给出一个rect, 和开始的角度,扫过的角度)
Polygons 多边形(笔,点的数组,和数组的个数)
Cardinal splines (比多边形多一个压力参数,并且最后端点不连接)
Bézier splines 样条(笔,起点,若干控制点,终点)
所有这些的东西的工作都将与Pen有关,也就是说我们在调用相关函数的时候得传给他们Pen资源
/////////////////////////////////////////////////
Path:通过组合上述的东西,或是另外一个路径形成路径,同其他图形一样通过Graphics进行处理。
/////////////////////////////////////////////////
   一个闭合的图形包括边界和内部,边界是关于画笔的,内部是关于刷子的
   闭合的曲线也是一个可填充图形,分为边界和内部
///////////////////////////////////////////////
   区域:各种图形的组合(交,并,异或,补,组合),主要表现为路径和矩形
   使路径平坦:在GraphicsPath中使用Flatten方法;反锯齿操作:在Graphics::SetSmoothingMode(&u);
//////////////////////////////////////////////////////////
二,图形,位图和元数据(二维图形)
Image对象用于处理位图和元数据;位图和元数据都继承于Image
Metafile:当Graphics用某个Metafile对象做为构造函数参数时,则Graphics中的画图操作被打到该文件中
通过Graphics其他方法将该文件打出
三,坐标系统和转换
三种坐标系:世界->逻辑->设备
Graphics的重要属性:
   Clip: 获取或设置 Region,该对象限定此 Graphics 的绘图区域。
   DpiX: 获取此 Graphics 的水平分辨率。(每英寸的点数) DpiY:   获取此Graphics的垂直分辨率。(每英寸的点数)
   IsClipEmpty: 绘图区域相关   IsVisibleClipEmpty: 绘图区域
   PageScale: 缩小放大   PageUnit: 单位
   SmoothingMode: 光滑模式   Transform: 变换
   ////////////////////////////////////////////////////////////////
使用GDI+
1,得到GDI+的相关文件(.h, .lib, 和.dll)
2,在使用GDI+之间需要做:(一些设置)
3,Pen
设置宽度和对齐方式(PenAlignmentCenter和PenAlignmentInset)设置笔的开头和结尾方式(SetStartCap和SetEndCap方法)    设置笔头连接方式(SetLineJoin方法)设置虚线样式(SetDashPattern方法)有的,没有的,有的,没有的
设置纹理(在笔的构造函数中填入纹理刷子)
4,Brush
Solid Color(有颜色就可以了)    Hatch Pattern(格子,给两个颜色)   Image Texture(纹理,给个图象);Brush::SetWrapMode(一些参数)   Color Gradient(创建渐变刷子)
附录:
1,GraphicsUnit:
Display指定显示设备的度量单位。通常,视频显示使用的单位是像素;打印机使用的单位是 1/100 英寸
Document将文档单位(1/300 英寸)指定为度量单位       Inch将英寸指定为度量单位
Millimeter将毫米指定为度量单位      Pixel将设备像素指定为度量单位
Point将打印机点(1/72 英寸)指定为度量单位      World将世界坐标系单位指定为度量单位
2,myGraphicsContainer = myGraphics.BeginContainer();
    myGraphics.TranslateTransform(0.0f, 100.0f);
    myGraphics.DrawRectangle(&myPen, 0, 0, 50, 50);
myGraphics.EndContainer(myGraphicsContainer);



下面是按照MSDN的逻辑进行介绍;
1, 使用笔画线和画图形
    1.1 使用笔画直线和矩形
    1.2 设置笔的宽度和对齐方式
    1.3 设置笔的开头和结尾样式
    1.4 直线的连接(几种给定的连接方式)
    1.5 画自定义的虚线(SetDashPattern;黑的多少,白的多少)
    1.6 画用纹理填充的直线(会用到刷子)
2, 使用刷子填充图形
    2.1 固体刷子
    2.2 hatch样式刷子
    2.3 纹理刷子
    2.4 图象刷子(个人认为和纹理刷子差不多)
    2.5 颜色渐变刷子
3, 使用images, bitmaps, and metafiles(后两个都继承于第一个)
    3.1 下载和显示一个位图
    3.2 下载和显示一个元数据
    3.3 记录一个元文件
            一些解释:元文件是记录一系列的画图命令,命令作为一个文件被记录,可以做为一个Image对象来使用
    3.4 使用DrawImage的重载(可以完成放大,缩小等功能)
    3.5 使用Images的仿射(从矩形到平行四边形,也是上述的一个重载)关于GDI+的一些说明
    3.6 使用插补模式控制image的缩放质量(InterpolationModeNearestNeighbor等 )
    3.7 创建微型images(GetThumbnailImage)
    3.8 创建Cached Bitmap,是一种与设备有关的图,这个性能将比bitmap好
    3.9 尝试给出images的大小以防止images的自动缩放
    3.10 读和写元数据(image的属性)
4, 使用Image的编码和解码器
5, 带透明度属性的直线和图形
           displayColor = sourceColor × alpha / 255 + backgroundColor × (255 – alpha) / 255
    5.1 画一个半透明和不透明的直线
    5.2 用不透明和半透明的刷子画图
    5.3 使用合成模式来控制透明混合
    5.4 使用颜色矩阵来设置images透明度(5*5矩阵,是RGBA空间,抱歉还真不知道为什么)
    5.5 为单个象素设置透明度
6, 使用文本和字体
    6.1 建立字体库和字体(在打印文本的时候,必须先建立字体库和字体)
    6.2 显示字符(DrawString;可以通过顶点定位和矩形框定位)
    6.3 格式化文本(StringFormat;DrawString中的一个参数)
    6.4 枚举已经安装过的字体
    6.5 创建私有字体
    6.6 获取字体构成(font family)
    6.7 反锯齿文本(SetTextRenderingHint)
7,   构建和画曲线
    7.1 画A cardinal spline(DrawCurve;DrawClosedCurve)
    7.2 画B样条曲线(DrawBeziers)
8,   利用渐变刷子填充图形
    8.1 创建一个线形渐变的刷子(LinearGradientBrush; SetBlend(亮度百分比,位置,数量))
    8.2 创建路径渐变(中心颜色,边界颜色(整个边界,对应点边界,),PathGradientBrush)
    8.3 使用SetGammaCorrection修正渐变
9, 构建和画一个路径
    9.1 从直线,曲线,和图形创建路径(path.addXXX)
    9.2 填充开放模型(FillPath, DrawPath)
10, 使用Graphics容器
    10.1 Graphics的状态或属性(先创建或是获取一个Graphics,设置其属性,调用DrawXXX)
             Quality setting(一些属性的设定),
             Transformations
             Clipping region(您所画的东西只是在某个区域有所显示SetClip和region的概念)
             (对于WIN32还有device context)
    10.2 使用嵌套的Graphics容器
         在BeginContainer()和EndContainer()中的受影响
11,使用区域
    11.1 定义一个区域Region(参数可以为路径,矩形框等)
    11.2 改变Graphics中的Clip属性(用SetClip方法)
12,坐标变换
    12.1 使用世界坐标变换(平移, 旋转, 缩放(用Matrix或者用相应的转换函数))
    12.2 注意变换的顺序是很重要的
13,颜色变换
    13.1 使用颜色变换矩阵(为什么是5X5?)
    13.2 平移变换,缩放变换,旋转变换
    13.3 shearing colors(更强的矩阵操作;矩阵操作中是怎么理解?)
   1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
          0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
          0.5f, 0.0f, 1.0f, 0.0f, 0.0f,
          0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
          0.0f, 0.0f, 0.0f, 0.0f, 1.0f
    13.4 使用颜色的重新映射(颜色拾取,颜色的重新设置),见imageAttrributes
14, 有关双缓冲
    14.1 窗体和控件的缓冲(DoubleBuffered属性和SetStyle方法)
    14.2 手动管理缓冲Graphics(每个应用程序都有自己的BufferedGraphicsContext)
            获取缓冲Graphics上下文
     BufferedGraphicsContext   myContext;
            myContext   =   BufferedGraphicsManager.Current;
            直接创建Graphics上下文(快,“非托管理”)
     BufferedGraphicsContext myContext;
            myContext = new BufferedGraphicsContext();
            // Insert code to create graphics here.
            // On a non-default BufferedGraphicsContext instance, you should always
            // call Dispose when finished.
            myContext.Dispose();
   14.3 手动渲染缓冲Graphics的整个过程
            获取BufferedGraphicsContext实体
     通过调用Allocate创建一个BufferedGraphics实体
     向BufferedGraphics中输出图形(对比向BufferedGraphics中输出图形;对比cout和fout等流的概念)
     调用BufferedGraphics::render方法将缓冲中图形打到Graphics上关于GDI+的一些说明
            完成操作后调用dispose释放BufferedGraphics     



群贤毕至

访客