GDI+簡介及其應用示例

隨着C# WINFORMS應用程序功能的越來越複雜,需求的越來越多,那麼不得不提到2個重要的接口Windows API和GDI(或者說GDI+),今天就來講解下GDI+及其一些應用示例。

GDI(graphic device interface,圖形設備接口),負責在屏幕和打印機上輸出信息。GDI+是GDI的後續版本。

要使用GDI+,首先應該創建Graphics類對象(簡單的來說,Graphics類對象就相當於畫布,沒畫布我們在什麼地方繪圖呢?),然後調用一系列繪圖方法即可,最後再釋放資源(調用Graphics類對象的Dispose()方法)。

那麼,第一步,創建Graphics類對象的幾種方式如下

方式一,

Form類的CreateGraphics()方法。

例如:this.CreateGraphics(); //這裏的this指的是當前form類

方式二,

重寫Form類的OnPaint事件方法,通過其中的PaintEventArgs對象的Graphics屬性來創建。

例如:override void OnPaint(PaintEventArgs e)
        {
           Graphics g = e.Graphics;

        }

通過以上2種方式的瞭解,我們可以知道Form類的派生控件都可以生成Graphics對象,例如button、picturebox都有CreateGraphics()方法。

方式三,

把現有的圖像轉換爲Graphics對象,參數是Image類的任何派生類。例如:

Bitmap bmap = new Bitmap("e:/test/1.jpg");//當然也可以指定寬高度進行創建
Graphics g = Graphics.FromImage(bmap);

第二步,認識基本的GDI+對象,輔助製圖

1,畫筆Pen對象:

Pen pen = new Pen(Color.Red);或使用系統預設的畫筆,如Pen pen = Pens.Black;

可以指定一些常見屬性

Width; //畫筆粗細屬性

Color; //畫筆顏色屬性

DashStyle;//畫線類型屬性,如pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;點線

2,筆刷對象,主要如下幾種:

實心筆刷 SolidBrush solidBrush = new SolidBrush(Color.Red);//筆刷顏色爲紅色

陰影筆刷,在System.Drawing.Drawing2D命名空間下

HatchBrush hatchBrush = new HatchBrush(HatchStyle.Vertical,Color.Blue,Color.Green);//筆刷的陰影樣式爲垂直,前景色爲藍色,背景色爲綠色

紋理陰影筆刷,可以理解爲以圖像爲填充的筆刷

 Image img1 = Image.FromFile("e:/test/1.jpg");
 TextureBrush textureBrush = new TextureBrush(img1);

 漸變筆刷,顧名思義吧

LinearGradientBrush lgbrush = new LinearGradientBrush(ClientRectangle,Color.Blue,Color.Green,LinearGradientMode.Horizontal);//參數解釋,ClientRectangle爲筆刷填充的範圍是整個當前Form對象;漸變色由藍色到綠色;漸變模式爲水平

3,顏色對象Color

使用系統預設的Color的枚舉,例如紅色Color.Red;

自定義顏色 Color color = Color.FromArgb(100,110,120,130);//參數解釋,100爲透明度,後面爲紅綠藍RGB的值

4,字體Font

Font font = new Font("黑體",24);也可用FontFamily類詳細指定格式如

 FontFamily fontFamily = new FontFamily("華文行楷");
 Font font = new Font(fontFamily,16,FontStyle.Regular);

第三步,繪製基本圖形

畫線 g.DrawLine(pen,0,0,10,10); //用畫筆工具在始終點進行畫線

畫矩形 g.DrawRectangle(pen,20,20,30,40);//用畫筆工具在起點畫寬度爲30,長度爲40的矩形

畫橢圓 g.DrawEllipse(pen,30,10,20,20);//用畫筆工具在圓心(30,10)橫向半徑爲20,縱向半徑爲20的橢圓

畫多邊形 g.DrawPolygon(pen, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });

填充矩形 g.FillRectangle(sredbrush, 20, 20, 30, 40);

填充橢圓 g.FillEllipse(sredbrush, 30, 10, 20, 20);

填充多邊形 g.FillPolygon(sredbrush, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });

填充扇形 g.FillPie(sredbrush, new Rectangle(20, 20, 30, 40), 90, 180); //從90度開始填充到180度

第四步,繪製文本

Font font = new Font("華文行楷",24);

 g.DrawString("文本內容",font,sredbrush,50,50);//在指定座標處繪製文本

g.DrawString("文本內容,在矩形範圍內將不斷字換行",font,sredbrush,new RectangleF(50,80,80,100));

第五步,繪製圖像

  Bitmap bitmap = new Bitmap("e:/test/1.jpg");
  g.DrawImage(bitmap,0,0);//在指定位置開始繪製圖像,或者

Image img = Image.FromFile("e:/test/1.jpg");
g.DrawImage(img,0,0);

驗證碼的示例:主要方法代碼如下

//生成驗證碼圖片,並在pbchecknum中顯示 count爲生成驗證碼的位數

void CreateCheckNum(int count) {
            //生成4位驗證碼
            string checkCode = "";
            string str = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
            string[] strs = str.Split(',');
            Random random=new Random();
            for (int i = 1; i <= count; i++)
            {
                checkCode+=strs[random.Next(0,strs.Length)];
            }
            checkNum=checkCode;
            //生成驗證碼圖像
            Bitmap bg = new Bitmap((int)Math.Ceiling(checkCode.Length*12.5),22);
            Graphics g = Graphics.FromImage(bg);
            Font font=new Font("Arail",12,FontStyle.Bold);
            LinearGradientBrush lgbrush=new LinearGradientBrush(new Rectangle(0,0,bg.Width,bg.Height),Color.Blue,Color.DarkRed,LinearGradientMode.Horizontal);
            g.DrawString(checkCode,font,lgbrush,2,2);
            //畫干擾線
            for (int i = 0; i < 4; i++)
            {
                int x1 = random.Next(bg.Width);
                int x2 = random.Next(bg.Width);
                int y1 = random.Next(bg.Height);
                int y2 = random.Next(bg.Height);
                g.DrawLine(new Pen(Color.GreenYellow),x1,y1,x2,y2);
            }
            //畫干擾點
            for (int i = 0; i < 100; i++)
            {
                int x = random.Next(bg.Width);
                int y = random.Next(bg.Height);
                bg.SetPixel(x,y,Color.FromArgb(random.Next()));
            }
            //畫邊框
            g.DrawRectangle(new Pen(Color.Red),new Rectangle(0,0,bg.Width-1,bg.Height-1));
            pbchecknum.Image = bg;//在pbchecknum中顯示
            //釋放資源
            g.Dispose();
        }

最終效果圖如下,其他的功能自己試着完善,不瞭解的還可以諮詢下我

GDI+簡介及其應用示例 - 天涯的海風 - 天涯的海風

有關ASP.NET的GDI+生成驗證碼的主體部分沒有多少區別,關鍵就是最終把當前頁面作爲圖片生成,並且放在輸出流種輸出。驗證碼字符串保存在COOKIE或者SESSION中。最後通過圖片控件指向此頁面,點擊超鏈接使圖片控件進行URL重寫再次指向此頁面即可完成局部更新驗證碼!主要代碼我找時間貼出來!

來了,現在貼出來了,就幾行,瞭解就行,呵呵

//保存驗證碼字符串

Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
 //Session["CheckCode"] = checkCode;//用於客戶端校驗碼比較

//把當前頁作爲圖片生成,方便調用,當然這要放在啊釋放資源前面

System.IO.MemoryStream ms = new System.IO.MemoryStream();
            bg.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            Response.ClearContent();
            Response.ContentType = "image/Jpeg";
            Response.BinaryWrite(ms.ToArray());

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章