GDI+與WPF中的顏色簡析
--------------------------------------------------------------------------------引用或轉載時請保留以下資訊:大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.com蘿蔔鼠線上圖形影象處理--------------------------------------------------------------------------------
我們知道,顏色在介面表面中起著舉足輕重的作用。讓我們來分析一下GDI+與WPF中的顏色。 一、GDI+中
二、WPF中:Color位於System.Windows.Media名稱空間下。由於WPF中有XAML,所以,我們分兩種情況來描述:1、當我們在XAML中使用顏色時,我們可以使用XAML的屬性:
下面分別舉例:使用藍色填充寬為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