GDI+基础知识
首先你要有点基本的几何概念。例如大家常说的点动成线,线动成面,面动成体。两点确定一条直线,不在同一直线上的三点确定一个圆(或者平面),诸如此类。然后你要理解的是,对应于几何概念中点,就是屏幕上的一个像素,因此,这种点和纯粹几何中的点还是有区别的。最后一个就是坐标了,和解析几何不同,其坐标系统如下:
正方向通常是从X轴旋转90°到Y轴那个方向,由于坐标位置的关系,你可以发现旋转的正方向是顺时针的,而不是像经典解析几何中的逆时针。
关于点。点是图形中最基本的单元,没有之一。C#中表示点的结构体是Point和PointF,前者接受的参数是整型,而后者则为float的浮点型(注意不是double类型,了解这一点很重要)。除此之外,两者并没有太大的区别,都是表示在二维平面中定义点的X 和 Y 坐标的有序对。另外,和现实世界中类似的,绘图需要有画笔,这在C#中被抽象为Pen类,它是用于绘制指定宽度和样式的直线和曲线。使用 DashStyle 属性绘制几种虚线。可以使用各种填充样式(包括纯色和纹理)来填充Pen 绘制的对象,填充模式取决于画笔或用作填充对象的纹理。该类是一个密封类,这意味着你无法继承该类。
关于颜色。颜色是描述图形的基本元素之一,GDI+中使用两种模式表示色彩,一个是RGB,另一个是CMYK。
RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216( )种颜色。在 RGB 模式下,每种 RGB 成分都可使用从0(黑色)到 255(白色)的值。 例如,亮红色使用 R 值 255、G 值 0 和 B 值 0。 当所有三种成分值相等时,产生灰色阴影。 当所有成分的值均为 255 时,结果是纯白色;当该值为 0 时,结果是纯黑色。
CMYK也称作印刷色彩模式,是一种依靠反光的色彩模式,和RGB类似,CMY是3种印刷油墨名称的首字母:青色Cyan、品红色Magenta、黄色Yellow。而K取的是black最后一个字母,之所以不取首字母,是为了避免与蓝色(Blue)混淆。从理论上来说,只需要CMY三种油墨就足够了,它们三个加在一起就应该得到黑色。但是由于目前制造工艺还不能造出高纯度的油墨,CMY相加的结果实际是一种暗红色。
GDI+中承担颜色的类是Color结构体,Color结构体只有一个默认的构造函数,不过它有许多有用的静态方法实现了颜色的构造和转换见下表:
静态方法 | 说明 |
FromArgb(Int32) | 从一个 32 位 ARGB 值创建 Color 结构 |
FromArgb(Int32, Color) | 从指定的 Color 结构创建 Color 结构,但要使用新指定的 alpha 值。 尽管此方法允许为 alpha 值传递 32 位值,但该值仅限于 8 位 |
FromArgb(Int32, Int32, Int32) | 从指定的8位颜色值(红色、绿色和蓝色)创建 Color结构。 alpha 值默认为 255(完全不透明)。 |
FromArgb(Int32, Int32, Int32, Int32) | 从四个 ARGB 分量(alpha、红色、绿色和蓝色)值创建 Color 结构。 |
FromKnownColor | 基于指定的预定义颜色创建 Color 结构 |
FromName | 基于预定义颜色的指定名称创建 Color 结构 |
另外,对于一个Color结构的实例,比较有用的方法如下:
实例方法 | 说明 |
GetBrightness | 获取此Color结构的“色调-饱和度-亮度”(HSB)的亮度值。 |
GetHue | 获取此Color结构的“色调-饱和度-亮度”(HSB)的色调值,以度为单位。 |
GetSaturation | 获取此Color结构的“色调-饱和度-亮度”(HSB)的饱和度值。 |
ToArgb | 获取此Color结构的32位ARGB值。 |
ToKnownColor | 获取此Color结构的KnownColor值。 |
例如创建一个红色的颜色对象可以是:
Color c = Color.FromArgb(255, 0, 0);
当然,Color中也有多达140种预定义的颜色,这些颜色基本上可以完成常见的任务,开头的几个颜色如下表:
属性 | 说明 |
AliceBlue | ARGB值为#FFF0F8FF的系统定义的颜色。 |
AntiqueWhite | ARGB值为#FFFAEBD7的系统定义的颜色。 |
Aqua | ARGB值为#FF00FFFF的系统定义的颜色。 |
Aquamarine | ARGB值为#FF7FFFD4的系统定义的颜色。 |
Azure | ARGB值为#FFF0FFFF的系统定义的颜色。 |
Beige | ARGB值为#FFF5F5DC的系统定义的颜色。 |
Bisque | ARGB值为#FFFFE4C4的系统定义的颜色。 |
Black | ARGB值为#FF000000的系统定义的颜色。 |
BlanchedAlmond | ARGB值为#FFFFEBCD的系统定义的颜色。 |
Blue | ARGB值为#FF0000FF的系统定义的颜色。 |
完整的颜色可以查看MSDN。
关于颜色,还有一个很有趣的属性是透明度的问题(Alpha)。事实上,Color对象的信息由一个32位的书籍表示,每8位代表一个信息,分别是透明度和红色、绿色和蓝色。透明度就是相对于悲剧的颜色的混合程度,取值为0~255。.0表示完全透明(完全是背景色),而255表示完全不透明,就是前景色。透明度的计算方法如下:蛇前景色和背景色的颜色中某个分量,例如蓝色,分别为B1和B2,如果透明度设置为Alpha值,则相互交叠的区域中颜色的蓝色分量值为:
B=B1*Alpha/255+B2*(255-Alpha)/255
对于其他颜色分量也有类似的计算公式。当然,计算的结果必须取整。下图中是Alpha分别为100和200的效果:
显然右图显得更加不透明。关于透明度的问题,还有在后面做详细的介绍。