更新:
既然你終於明確你想要的這裏是將兩種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;
}
這裏有一個例子:
我離開舊的答案,因爲有些人有興趣的話,太:
如果要混合的顏色,你可以很容易地做到這一點,也許是這樣的:
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°遠離比較比色圖表。注意如何簡單混合的很多是用更少的飽和迷霧:
什麼是它應該是什麼樣子的? – 2014-10-02 16:30:10
目前沒有什麼可以「結合」或「追加」兩個畫筆。您必須明確說明在某人提供解決方法之前,這意味着什麼。 – 2014-10-02 16:38:45
如果你想混合顏色,這將是容易的。我們在談論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