10. Graphics的幾個屬性。
今天我來講講Graphics在DrawImage裡的幾個的屬性。
Graphics是GDI+裡面的大拿,可以用來畫線,畫矩形,甚至可以用來畫各種各樣的材質。 通過不同的Pen,Brush來實現。具體的使用方法是所有想用GDI+的同學的基礎,我就不詳細講 了,具體可以參考MSDN:http://msdn.microsoft.com/en-us/library/haxsc50a(VS.80).aspx 。我主要來講2個大家不太注意的屬性。
a.Graphics.CompositingMode
這是一個枚舉屬性,可以取的值有2種,一種是SourceOver, 另外一種是SourceCopy。這 定義了Graphics如何將當前顏色和背景合成。如果是SourceCopy,那麼顏色不和當前背景合 成。如果是SourceOver,那麼背景顏色會和當前的顏色混合,算法如下:
顯示顏色 = 源顏色 × alpha / 255 + 背景顏色 × (255 - alpha) / 255
新顏色的透明分量是255,也就是不透明。我們來看看下面的代碼:
private int CompositeColor(int color, int alpha, int backgroudColor)
{
//顯示顏色 = 源顏色 × alpha / 255 + 背景顏 色 × (255 - alpha) / 255
return color * alpha / 255 + backgroudColor * (255 - alpha) / 255;
}
private void Draw(object sender, EventArgs e)
{
this.BackColor = Color.FromArgb(255, 255, 255);
Graphics g = this.CreateGraphics();
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(0, 0, 200, 200));
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(new SolidBrush(Color.FromArgb(127, 255, 0, 0)), new Rectangle(200, 0, 200, 200));
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(new SolidBrush(Color.FromArgb(
255,
CompositeColor(255, 127, 255),
CompositeColor(0, 127, 255),
CompositeColor(0, 127, 255))
), new Rectangle(0, 200, 200, 200));
g.Dispose();
}
第1個色塊和第2個色塊分別是混合和不混合的,如果我們用不混合的方式希望得到混合的 效果,那麼應該用第三個色塊的寫法。從下面的圖像中我們可以很清楚地看到結果。
b.Graphics.CompositingQuality
合成質量,一共有5種
根據我們上一節的算法,圖像的合成是浮點運算,計算量非常大。此外,由於圖像存儲最 後是需要被量化的,所以在量化的過程中會不可避免地出現鋸齒的情況,為了平滑鋸齒,又 需要大量的計算。還有一個問題,如果我們有很多層不同的透明圖像,需要進行合成,那麼 每一層都需要進行合成運算。其實這種合成運算式可以被優化的。CompositingQuality這個 屬性就是GDI+用來解決這些問題的。MSDN裡面只是簡單地說質量越高速度越慢,具體的算法 不得而知。
HighQuality使用平滑技術去除在合成中出現的鋸齒,並合成當前的Gamma灰度信息,這種 計算是最慢的,並且出來的顏色與非GammaCorrected是不一樣的。
GammaCorrected 合成當前Gamma灰度信息,但是不進行計算優化。
HighSpeed優化計算速度,出來的質量稍微有點差,如果不是對質量要求很高時看不出來 的。
AssumeLinear的質量比Default稍好,速度稍慢,這種算法是假定合成中插值的像素變化 是線性的。
Default就是最基本的計算方法。
Invalid未知,我也不知道,要是有知道的朋友可以告訴我。
其中HighQuality/GammaCorrected效果一樣,其余四種一樣。可以參考下圖。