隨着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();
}
最終效果圖如下,其他的功能自己試着完善,不瞭解的還可以諮詢下我
有關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());