2014-10-02 80 views
0

是否有任何方法或解決方法將兩個System.Drawing.Brush類組合/附加在一起?如何附加兩個刷子類

例如Brush b1 = GetFromSomewhere();

Brush b2 = GetFromSomewhereElse(); 

(類似的東西...)

Brush b3 = b1 + b2; 

最終我的目的是做這樣的事情:

Graphics graphics = new Graphics; 
graphics.FillRectangle(b3, rectangle); 

更新: 我有一個第三方庫(無法控制它),它給了我一個預定義的Brush實例(表示填充模式,例如++++或#####)。我想用「我自己」的筆刷模式「覆蓋」那個實例。

+2

什麼是它應該是什麼樣子的? – 2014-10-02 16:30:10

+1

目前沒有什麼可以「結合」或「追加」兩個畫筆。您必須明確說明在某人提供解決方法之前,這意味着什麼。 – 2014-10-02 16:38:45

+0

如果你想混合顏色,這將是容易的。我們在談論SolidBrush嗎?還有其他更復雜的刷子類型,其中混合物沒有多大意義。或者您的意思是[CompoundPen](http://msdn.microsoft.com/en-us/library/system.drawing.pen.compoundarray%28v=vs.110%29.aspx)? – TaW 2014-10-02 17:05:21

回答

3

更新:

既然你終於明確你想要的這裏是將兩種TextureBrushes的解決方案:

我假設你已經在Image IMG2您TextureBrush格局。使用下面的簡單的方法來混合兩個相同尺寸的圖像,並通過使用組合模式創建新刷:

TextureBrush brush3 = new TextureBrush(
         mixBitmaps((Bitmap)(brush1.Image), (Bitmap) img2) ); 

現在你可以畫或用它填充的東西..

Bitmap mixBitmaps(Bitmap bmp1, Bitmap bmp2) 
{ 
    using (Graphics G = Graphics.FromImage(bmp1)) 
    { 
     G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; 
     G.DrawImage(bmp2, Point.Empty); 
    } 
    return bmp1; 
} 

這裏有一個例子:

texture mix


我離開舊的答案,因爲有些人有興趣的話,太:

如果要混合的顏色,你可以很容易地做到這一點,也許是這樣的:

SolidBrush MixColor(SolidBrush b1, SolidBrush b2) 
{ 
    return new SolidBrush(Color.FromArgb(Math.Max(b1.Color.A, b2.Color.A), 
         (b1.Color.R + b2.Color.R)/2, (b1.Color.G + b2.Color.G)/2, 
         (b1.Color.B + b2.Color.B)/2)); 
} 

您可能需要alpha通道設置爲一個固定值而不是255。

然而,這是一個簡單的平均值計算研究,如果顏色是不接近,不會很好地工作。

爲了更好的搭配,你會從飽和度和亮度值separatly混合的色彩,那是你將不得不轉換爲HSL或HSV,混合存在,並轉換回RGB ..

這裏是一個版本,應該這樣做:

SolidBrush MixBrushes(SolidBrush br1, SolidBrush br2) 
{ 
    return new SolidBrush (MixColorHSV(br1.Color, br2.Color)); 
} 

Color MixColorHSV(Color c1 , Color c2) 
{ 
    double h1 = c1.GetHue(); 
    double h2 = c2.GetHue(); 
    double d = (h2 - h1)/2d; 
    double h = h1 + d; 
    if (d > 90) h -= 180; else if (d < -90) h += 180; // correction 1! 
    if (h < 0) h += 360; else if (h > 360) h -= 360; // correction 2! 

    int max1 = Math.Max(c1.R, Math.Max(c1.G, c1.B)); 
    int min1 = Math.Min(c1.R, Math.Min(c1.G, c1.B)); 
    double s1 = (max1 == 0) ? 0 : 1d - (1d * min1/max1); 
    double v1 = max1/255d; 

    int max2 = Math.Max(c2.R, Math.Max(c2.G, c2.B)); 
    int min2 = Math.Min(c2.R, Math.Min(c2.G, c2.B)); 
    double s2 = (max2 == 0) ? 0 : 1d - (1d * min2/max2); 
    double v2 = max2/255d; 

    double s = (s1 + s2)/2d; 
    double v = (v1 + v2)/2d; 

    return ColorFromHSV(h,s,v); 
} 

public static Color ColorFromHSV(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 

    value = value * 255; 
    int v = Convert.ToInt32(value); 
    int p = Convert.ToInt32(value * (1 - saturation)); 
    int q = Convert.ToInt32(value * (1 - f * saturation)); 
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 

    if (hi == 0)  return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) return Color.FromArgb(255, t, p, v); 
    else    return Color.FromArgb(255, v, p, q); 
} 

請參閱this post轉換的部分!

這裏是兩個混合加入紅顏色的每個30°遠離比較比色圖表。注意如何簡單混合的很多是用更少的飽和迷霧: two color mixes

+0

這就是它!完美,謝謝 – Nostradamus 2014-10-03 12:00:07