程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> GDI+中常見的幾個問題(10)

GDI+中常見的幾個問題(10)

編輯:關於.NET

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種

  成員名稱 說明   AssumeLinear 假定線性值。    Default 默認質量。    GammaCorrected 使用灰度校正。    HighQuality 高質量、低速度復合。    HighSpeed 高速度、低質量。    Invalid 無效質量。  這部分東西稍有點學問,MSDN裡面沒怎麼講清楚,有些實踐派的同學用了其他的幾個相關的 屬性來解釋GDI+中的圖像質量,例如 http://www.cnblogs.com/adow/archive/2007/10/05/914573.html,不過不得精髓。我來解 釋一下圖像合成的一些理論基礎。這裡還需要和另外一個屬性InterpolationMode加以區分。 這個屬性的具體使用我會在下一節講到,而合成質量與插值不是一回事。

根據我們上一節的算法,圖像的合成是浮點運算,計算量非常大。此外,由於圖像存儲最 後是需要被量化的,所以在量化的過程中會不可避免地出現鋸齒的情況,為了平滑鋸齒,又 需要大量的計算。還有一個問題,如果我們有很多層不同的透明圖像,需要進行合成,那麼 每一層都需要進行合成運算。其實這種合成運算式可以被優化的。CompositingQuality這個 屬性就是GDI+用來解決這些問題的。MSDN裡面只是簡單地說質量越高速度越慢,具體的算法 不得而知。

HighQuality使用平滑技術去除在合成中出現的鋸齒,並合成當前的Gamma灰度信息,這種 計算是最慢的,並且出來的顏色與非GammaCorrected是不一樣的。

GammaCorrected 合成當前Gamma灰度信息,但是不進行計算優化。

HighSpeed優化計算速度,出來的質量稍微有點差,如果不是對質量要求很高時看不出來 的。

AssumeLinear的質量比Default稍好,速度稍慢,這種算法是假定合成中插值的像素變化 是線性的。

Default就是最基本的計算方法。

Invalid未知,我也不知道,要是有知道的朋友可以告訴我。

其中HighQuality/GammaCorrected效果一樣,其余四種一樣。可以參考下圖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved