GDI+与WPF中的颜色简析
--------------------------------------------------------------------------------
引用或转载时请保留以下信息:
大可山 [MSN:a3news(AT)hotmail.com]
http://www.zpxp.com http://www.brawdraw.com
萝卜鼠在线图形图像处理
--------------------------------------------------------------------------------
我们知道,颜色在界面表面中起着举足轻重的作用。让我们来分析一下GDI+与WPF中的颜色。
一、GDI+中:
Color位于System.Drawing命名空间下。
当我们需要使用某种颜色时,我们可以用以下几种方式:
(1)Color.FromArgb(alpha, red, green, blue) //alpha为0~255
(2)Color.FromArgb(red, green, blue) //此时alpha值始终为255,即不透明
(3)Color.FromKnownColor(KnownColor color)
(4)Color.FromName(string knownColorString)
(5)Color.FromSysIcv(int icv)
比如:
Color redAlpha50Percent = Color.FromArgb(128, 255, 0, 0); //半透明红色
Color redWithoutAlpha = Color.FromArgb(255, 0, 0); //红色(完全不透明)
Color redFromKnownColor = Color.FromKnownColor(KnownColor.Red);
Color redFromName = Color.FromName("Red");
比如用红色填充一个矩形:
graphics.FillRectangle(new SolidBrush(redFromKnownColor), 10, 10, 100, 40);
为了进行比较,我将有区别的静态方法用“ 代码 ”底色突出。
由于某些颜色“众所周知”,在各种环境和操作系统中均使用统一的字面说法,比如红色(Red),黑色(Black)等等。它们是在系统中已知(或者说是已经预先定义)的颜色。
这些常见的颜色如下图:
二、WPF中:
Color位于System.Windows.Media命名空间下。
由于WPF中有XAML,所以,我们分两种情况来描述:
1、当我们在XAML中使用颜色时,我们可以使用XAML的属性:
(1)<object property="predefinedColor"/>
predefinedColor为预定义颜色(见上图)
(2)<object property="#rgb"/>
(3)<object property="#rrggbb"/>
(4)<object property="#argb"/>
(5)<object property="#aarrggbb"/>
其中r,g,b分别为0~F的十六进制颜色值,a为0~F的十六进制值,用于表示Alpha数值(不透明度)。
(6)<object property="sc# scA,scR,scG,scB"/>
其中,sc# 为关键字,scA,scR,scG,scB为介于0.0~1.0的Single值。
(7)<object property="ContextColor profileUri alphaValue,colorValue"/>
其中,ContextColor为关键字,profileUri为icm文件的地址,后面是alpha值和颜色值。
下面分别举例:
使用蓝色填充宽为100,高为40的矩形:
其中,Blue为预定义颜色(蓝色,它的十六位进制#rgb的表示是:#00F;#rrggbb的表示是:#0000FF;#argb表示是:#00F;#aarrggbb表示为:#FF0000FF)
(1)XAML代码:
<Rectangle Width="100" Height="40" Fill="Blue" />
注意:这里的Rectangle对应于上面的object, Fill则对应于property,而Blue就是预定义好的颜色值了。但需要说明的是,这里的Fill="Blue"最终会被转换成SolidColorBrush.
C#代码:
Rectangle myPredefinedBrushRectangle = new Rectangle();
myPredefinedBrushRectangle.Width = 100;
myPredefinedBrushRectangle.Height = 40;
myPredefinedBrushRectangle.Fill = Brushes.Blue;
(2)也可以这样:
<Rectangle Width="100" Height="40" Fill="#FF0000FF" />
(3)还可以这样:
<Rectangle Width="100" Height="40">
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color A="255" R="0" G="0" B="255" />
<!-- 还可以这样:
<Color ScA="1.0" ScR="0.0" ScG="0.0" ScB="1.0" />
-->
</SolidColorBrush.Color>
</SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
上面的SolidColorBrush标签的内容还可以改成:
<SolidColorBrush Color="ContextColor
file://C:/WINDOWS/system32/spool/drivers/color/sRGB%20Color%20Space%20Profile.icm
1.0,0.0,0.0,1.0"/>
如果用C#代码:
Rectangle myRgbRectangle = new Rectangle();
myRgbRectangle.Width = 100;
myRgbRectangle.Height = 40;
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Color.FromArgb(255, 0, 0, 255);
myRgbRectangle.Fill = mySolidColorBrush;
2、使用C#代码描述:
(1)Color.FromRgb(red, green, blue)
(2)Color.FromArgb(alpha, red, green, blue)
//alpha, red, green, blue为0~255的byte值
(3)Color.FromValues(colorValues, iccUri)
(4)Color.FromAValues(alpha, colorValues, iccUri)
//alpha为0.0f~1.0f的值; colorValues为float[4]数组, 所有值均为0.0f~1.0f的值; iccUri为icc文件的地址
见下例:
private Color FromAValuesExample()
{
// 褐色
Color myAValuesColor = new Color();
float [] colorValues = new float[4];
colorValues[0] = 0.0f;
colorValues[1] = 0.5f;
colorValues[2] = 0.5f;
colorValues[3] = 0.5f;
//定义颜色映射的icc文件
Uri iccUri = new Uri("C://sampleColorProfile.icc");
myAValuesColor = Color.FromAValues(1.0f, colorValues, iccUri);
return myAValuesColor;
}
(5)Color.FromScRgb(scA, scR, scG, scB)
scA, scR, scG, scB为Single类型值,比如:Color.Color.FromScRgb(1, 0, 0, 1);
最后举个完整点的例子:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<StackPanel Margin="20">
<Rectangle Width="100" Height="40" Margin="10">
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color ScA="1.0" ScR="0.0" ScG="0.0" ScB="1.0" />
</SolidColorBrush.Color>
</SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="100" Height="40" Margin="10">
<Rectangle.Fill>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color A="255" R="0" G="0" B="255" />
</SolidColorBrush.Color>
</SolidColorBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="100" Height="40" Margin="10">
<Rectangle.Fill>
<SolidColorBrush Color="ContextColor
file://C:/WINDOWS/system32/spool/drivers/color/sRGB%20Color%20Space%20Profile.icm
1.0,0.0,0.0,1.0"/>
</Rectangle.Fill>
</Rectangle>
</StackPanel>
</Page>
效果很简单(如下图):
三、比较一下:
我们发现,第二条1中(6)、(7)是在GDI+中所没有的。WPF为了更好的描述颜色,新增了scRGB颜色空间。还增加了icc文件对颜色的描述。
我们还发现,对于GDI+中的KnownColor,在WPF的C#代码中,已不见“踪影”,其实那是被转为另一种表现形式罢了。
实际上,WPF还对GDI+中没有涉及的CYMK印刷色的相关处理作了扩充。我会在今后的文章中详细描述它们。
更多参考:
Understanding the Colors in .NET http://www.digcode.com/default.aspx?page=ed51cde3-d979-4daf-afae-fa6192562ea9&article=2c0290b8-6d38-4ce7-951d-c9080a187bef
.Net Color.cs http://www.koders.com/csharp/fid9CA7E93CA709734A9EFC563E7FAA04FCB3779F52.aspx
GDI+与WPF中的颜色简析的更多相关文章
- WPF 任务栏颜色 - 简书
原文:WPF 任务栏颜色 - 简书 先看看效果,这种效果可以用来做进度条或者消息通知闪烁. image.png image.png image.png image.png 有一个好消息 ...
- MMS源码中异步处理简析
1,信息数据的查询,删除使用AsycnQueryHandler处理 AsycnQueryHandler继承了Handler public abstract class AsyncQueryHandle ...
- jquery Ajax中的dataType简析
jquery中的ajax有好几种运用方式,但是基本上都是使用的$.ajax()方法,很多人经常会使用它来从后台获取json格式的数据,但是经常发现返回的json字符串并不能自动的转换成js里的json ...
- Matlab中边缘提取方法简析
1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...
- java中深拷贝浅拷贝简析
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- WPF中的颜色转换
HEX16色转Bursh: Brush brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFF ...
- 在WPF中制作正圆形公章
原文:在WPF中制作正圆形公章 之前,我利用C#与GDI+程序制作过正圆形公章(利用C#制作公章 ,C#制作公章[续])并将它集成到一个小软件中(个性印章及公章的画法及实现),今天我们来探讨一下WPF ...
- 简述WPF中的画刷(Brush)
原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...
- Unity5中新的Shader体系简析
一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...
随机推荐
- occcont.cpp 925
将InitInstance()中调用的 InitATL() 替换为 AfxOleInit()即可.
- Java中关键字throw和throws的区别
==========================================题外话===================================================== 今 ...
- [RxJS] Reusable multicasting with Subject factories
The way we use publish() (or multicast with an RxJS Subject) makes the shared Observable not reusabl ...
- Python爬虫之路——简单的网页抓图
转载自我自己的博客:http://www.mylonly.com/archives/1401.html 用Python的urllib2库和HTMLParser库写了一个简单的抓图脚本.主要抓的是htt ...
- blob-照片转换与展示
File转java.sql.Blob(照片)Struts2 public Blob photos(File zp) { Blob photo=null; try { FileInputStream f ...
- Java-Maven项目引入UEditor图片上传组件jar包类库的5种方式
最近,硬是和百度的UEditor组件杠上了.自己的个人官网项目,很容易就搞定了,公司的项目,尼玛,各种问题.项目多了,环境复杂了,解决问题的方法也得不断调整. 项目用Maven管理jar包,用到了UE ...
- Android 面试之横竖屏切换的Activity生命周期
public class EngineerJspActivity extends Activity { private static String Tag = "EngineerJspAct ...
- 前端切图:CSS实现隐藏滚动条同时又可以滚动
CSS 实现隐藏滚动条同时又可以滚动 原始功能: 图片发自简书App 添加伪类之后的功能: 图片发自简书App 完整demo如下: <!DOCTYPE html> <html> ...
- 电子商务网站的设计与实现(四):项目名称malling和一期开发计划
项目名称:小雷B2C商城系统代号:malling,mall商城的意思,加个ing表示正在进行.更主要的是与"morning"发音很像,非常容易记忆.morning是"早上 ...
- Java数组定义学习的一些随笔
//一维数组的定义 int[] arr1 = new int[3];//arr1 = {1,2,3}: 错误 int[] arr2 = new int[]{1,2,3};//int[] arr2 = ...