.net FrameWork 3.0 后,我们会发现有两个Color数据结构。
一个是:System.Drawing.Color
一个是:System.Windows.Media.Color
这两个结构有啥区别呢?
下面是对这两个类的属性的一个简单比较:
System.Drawing.Color Structure | System.Windows.Media.Color Structure | |
所在组件 | System.Drawing.dll | PresentationCore.dll |
支持的版本 | .NET Framework .NET Compact Framework XNA Framework | .NET Framework |
A | Gets the alpha component value of this Color structure. | Gets or sets the sRGB alpha channel value of the color. |
B | Gets the blue component value of this Color structure. | Gets or sets the sRGB blue channel value of the color. |
G | Gets the green component value of this Color structure. | Gets or sets the sRGB green channel value of the color. |
R | Gets the red component value of this Color structure. | Gets or sets the sRGB red channel value of the color. |
ScA | 不支持 | Gets or sets the ScRGB alpha channel value of the color. |
ScB | 不支持 | Gets or sets the ScRGB blue channel value of the color. |
ScG | 不支持 | Gets or sets the ScRGB green channel value of the color. |
ScR | 不支持 | Gets or sets the ScRGB red channel value of the color. |
获得系统支持的一些颜色 | 在Color中定义了141种系统预定义的颜色 调用方法如下: System.Drawing.Color.AliceBlue | 不在Color中定义,而是Colors中定义,获得方法类似下面写法: System.Windows.Media.Colors.AliceBlue 系统一共预定义了141个颜色。 |
小结 | 只支持 sRGB。向下兼容 | 同时支持 sRGB、ScRGB。不兼容3.0以下的版本 |
我们可以在上面看到,关键是sRGB和ScRGB两种颜色表示方法。这两种有啥差别呢?我们来看下面三副图,先来感性的看看:
这幅图的巧妙之外在于它通过“归一化”,用两维平面来表示三个数据。X轴是红色的比例,Y轴是绿色的比例,而Z轴是蓝色的比例,虽然Z轴没有画出来,但它的比例数据可以很方便地计算出来。比方红是0.2,绿是0.3,那么蓝就是0.5。因为它们三者加起来必须等于1,不然怎么叫“归一化”呢!图上任何一点的蓝色分量,你都可以用这个方法计算出来。
图中的“舌形”色域空间,是人眼能够辨别的色彩空间,它的边缘围绕一道从波长从380到700(毫微米)的光谱,中间就是用红、绿、蓝三种颜色按不同比例调配出来的颜色。
而图中的三角的区域,是 sRGB 可以表示的颜色范围。显然有一些我们人类可以看到的颜色,但是sRGB来描述的。
上面这幅图对比了 sRGB、人眼、ScRGB 可以表示的颜色范围。
上面这幅图是sRGB和ScRGB两幅图的比较,注意看放大了的云彩。
sRGB 和 scRGB 的转换
在 System.Windows.Media.Color 结构中,scRGB原色其实是被储存成单精度(single-precision)的浮点数。想要容纳scRGB颜色空间,Color 结构包含四个主要的property,类型都是float,分别为ScA、ScR、ScG、ScB。
这些property和A、R、G、B property 会相互影响,改编G property也会造成ScG property的改变,反之亦然。
当G property 为0,ScG property 也会为0;当G property 为255,ScG property 就会为1。在这个范围之内,
关系并非是线性的,如下表所示。
scG | G |
<= 0 | 0 |
0.1 | 89 |
0.2 | 124 |
0.3 | 149 |
0.4 | 170 |
0.5 | 188 |
0.6 | 203 |
0.7 | 218 |
0.8 | 231 |
0.9 | 243 |
>=1.0 | 255 |
ScR 与 R 之间的关系,ScB与B之间的关系,以及ScG与G之间的关系,也都是一样的。ScG的值可以小于0或者大于1,以容纳超出显示器和sRGB数字范围的颜色。
sRGB和scRGB的比较
sRGB目标是使同一网页在不同计算机上显示时的色彩更一致,但只适用于CRT显示器。微软HD Photo项目负责人克劳说,sRGB的挑战在于它只是完整色彩空间的一个子集,当使用sRGB编码时,我们会丢掉一些色彩。
scRGB色彩空间是sRGB扩展,对于黑色和纯绿色而言,这二者没有任何分别。二者的差别就在于scRGB能够显示人眼无法分辨的颜色,其精细程度也超过了sRGB。
scRGB描述每个点所需要的位数是sRGB 2倍,甚至是4倍。不仅能够使用整数,还能够使用浮点数,提高图像的精细程度。
参考资料:
关于scRGB色彩空间
http://hi.baidu.com/cybo/blog/item/8f24ba38bbb584c1d5622597.html
第二章 基本的Brush画刷类 [App = Code + Markup]
http://www.cnblogs.com/rickiedu/archive/2007/04/04/699529.html
GDI+与WPF中的颜色简析
http://blog.csdn.net/johnsuna/archive/2007/08/27/1761061.aspx
简述WPF中的图像像素格式(PixelFormats)
http://blog.csdn.net/johnsuna/archive/2007/08/28/1762901.aspx