2011-01-10 49 views
9

最近我遇到了一個基於色調和亮度值的.NET顏色圖表。什麼讓我感到瘋狂的灰度圖。例如,DarkGray實際上比Gray更輕?另外,我看不到rgb值漸變中的任何邏輯,它從0到105到128?建立一個GrayScaleBrushes類

0 : Black 
105 : DimGray 
128 : Gray 
169 : DarkGray! 
192 : Silver 
211 : LightGray 
220 : Gainsboro 
245 : Ghostwhite 
255 : White 

http://sites.google.com/site/cdeveloperresources/

color chart - see link above

我要的是一個GrayScaleBrushes類的行爲完全與Brushes類一樣,但我自定義的配置,如:

GrayScaleBrushes.Pct05 
GrayScaleBrushes.Pct10 
GrayScaleBrushes.Pct15 
..all the way to.Pct95 
... 
ie: e.FillRectangle(GrayScaleBrushes.Pct05, exampleRect); 

怎麼辦確保刷子能正確處理?

編輯: .NET筆刷類如下所示(使用反射器反彙編)。

public sealed class Brushes 
{ 
    // Fields 
    private static readonly object AliceBlueKey = new object(); 

    // Methods 
    private Brushes() 
    { 
    } 

    // Properties 
    public static Brush AliceBlue 
    { 
     get 
     { 
      Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[AliceBlueKey]; 
      if (brush == null) 
      { 
       brush = new SolidBrush(Color.AliceBlue); 
       SafeNativeMethods.Gdip.ThreadData[AliceBlueKey] = brush; 
      } 
      return brush; 
     } 
    } 
} 

SafeNativeMethods似乎對我無法訪問。假設我剛剛在一個靜態方法中返回了一個SolidBrush,會不會正確地處理所有東西? (以及如何測試呢?)

public sealed class GrayScaleBrushes 
{ 
    private static SolidBrush pct05 = null; 

    public static SolidBrush Pct05 
    { 
     get 
     { 
      if (pct05 == null) 
      { 
       int rgbVal = GetRgbValFromPct(5); 
       pct05 = new SolidBrush(Color.FromArgb(rgbVal, rgbVal, rgbVal)); 
      } 
      return pct05; 
     } 
    } 

    private static int GetRgbValFromPct(int pct) 
    { 
     return 255 - (int)(((float)pct/100f) * 255f); 
    } 
} 
+8

至於原因`深灰> Gray`,請參見維基百科:http://en.wikipedia.org/wiki/X11_color_names#Color_names_that_clash_between_X11_and_HTML.2FCSS – 2011-01-10 20:52:13

回答

1

SafeNativeMethods在這種情況下只是一個簡單的高速緩存,其中包含一個刷子的副本。因此,第二次調用屬性getter不會創建新的實例。相反,它會始終返回相同的畫筆。

要做到這一點,你也許可以重寫你的函數是這樣的:

public static class GrayScaleBrushes 
{ 
    private static SolidBrush _Pct05; 

    public static SolidBrush Pct05 
    { 
     get 
     { 
      if (_Pct05 == null) 
      { 
       var value = GetRgbValFromPct(5); 
       _Pct05 = new SolidBrush(Color.FromArgb(value, value, value)); 
      } 

      return _Pct05; 
     } 
    } 

    private static int GetRgbValFromPct(int pct) 
    { 
     // no need to convert to float and back to int again 
     return 255 - ((pct * 255)/100); 
    } 
} 

該解決方案將創建灰度作爲必要的,但通過檢查每次調用時null的成本。您可以通過採取這樣的做法再次改變它內存問題做到這一點速度問題

public static class GrayScaleBrushes 
{ 
    public static readonly SolidBrush Pct05; 

    static GrayScaleBrushes() 
    { 
     var value = GetRgbValFromPct(5); 
     Pct05 = new SolidBrush(Color.FromArgb(value, value, value)); 
    } 
} 

但我認爲在這種情況下,它只是味道,原因也不是速度,也不是一個問題記憶在兩種情況下都是一個真正的問題。

1

Brushes類是靜態的,只能泄漏少量對應的定義所以才讓這些資源應用程序退出時被清理的顏色數量的資源。相反,請務必確保您的畫筆除非被引用,否則不會實際創建。這將加速啓動並確保未使用的顏色不會消耗資源。

1

我想提出以下建議:

創建一個靜態類GrayScaleBrushes

創建與強度百分比(INT)爲核心的靜態字典,

創建一個單一的靜態索引屬性「 Pct',你會像GrayScaleBrushes.Pct [10]那樣使用它來返回字典條目。

現在你既可以做奧利弗說和動態創建字典條目,他們是所謂的,或者你可以通過20項使用靜態構造函數循環,並將其添加到字典中。

這種方法woud不必創建和維護20個多屬性救你。乾杯。