基本图形绘制
1、绘制直线
两点确定一条直线,采用Graphics类中的DrawLine方法
private void button1_Click(object sender, EventArgs e) { Pen blackPen = new Pen(Color.Black, 3);//实例化Pen类 Point point1 = new Point(10, 50);//实例化一个Point类 Point point2 = new Point(100, 50);//再实例化一个Point类 Graphics g = this.CreateGraphics();//实例化一个Graphics类 g.DrawLine(blackPen, point1, point2);//调用DrawLine方法绘制直线 } private void button2_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics();//实例化Graphics类 Pen myPen = new Pen(Color.Black, 3);//实例化Pen类 graphics.DrawLine(myPen, 150, 30, 150, 100);//调用DrawLine方法绘制直线 }
2、绘制矩形,采用Graphics类中的DrawRectangle方法
private void button1_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics();//声明一个Graphics对象 Pen myPen = new Pen(Color.Blue, 8);//实例化Pen类 //调用Graphics对象的DrawRectangle方法 graphics.DrawRectangle(myPen, 10, 10, 150, 100); }
3、绘制正方形,采用Graphics类中的DrawRecentangle方法,将宽和高设置相同即可
private void button1_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics();//声明一个Graphics对象 Pen myPen = new Pen(Color.Blue, 8);//实例化Pen类 //调用Graphics对象的DrawRectangle方法 graphics.DrawRectangle(myPen, 30, 10, 100, 100); }
4、绘制椭圆,采用Graphics类中的DrawEllipse方法
private void button1_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics();//创建Graphics对象 Pen myPen = new Pen(Color.DarkOrange, 3);//创建Pen对象 graphics.DrawEllipse(myPen, 55, 20, 100, 50);//绘制椭圆 }
5、绘制指定弧度的扇形,采用Graphics类中的DrawPie方法
private void button1_Click(object sender, EventArgs e) { Graphics ghs = this.CreateGraphics();//实例化Graphics类 Pen myPen = new Pen(Color.DarkRed, 3);//实例化Pen类 Rectangle myRectangle = new Rectangle(50, 20, 100, 60);//定义一个Rectangle结构 ghs.DrawArc(myPen, myRectangle, 180, 180);//绘制圆弧 }
6、绘制贝尔曲线,采用Graphics类中的DrawBezier方法
private void button1_Click(object sender, EventArgs e) { Graphics ghs = this.CreateGraphics();//实例化Graphics类 Pen mypen = new Pen(Color.Black, 3);//实例化Pen类 ghs.DrawPie(mypen, 20, 10, 120, 100, 210, 120);//绘制扇形 }
7、绘制多边形,采用Graphics类中的DrawPolygon方法
private void Draw_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics();//实例化一个GDI+绘图图面类对象 Pen myPen = new Pen(Color.Blue, 3);//实例化一个用于绘制直线和曲线的对象 float startX = 50.0F;//实例化起始点的x坐标 float startY = 80.0F;//实例化起始点的y坐标 float controlX1 = 200.0F;//实例化第一个控制点的x坐标 float controlY1 = 20.0F;//实例化第一个控制点的y坐标 float controlX2 = 100.0F;//实例化第二个控制点的x坐标 float controlY2 = 10.0F;//实例化第二个控制点的y坐标 float endX = 190.0F;//实例化结束点的x坐标 float endY = 40.0F;//实例化结束点的y坐标 graphics.DrawBezier(myPen, startX, startY, controlX1, controlY1, controlX2, controlY2, endX, endY);//绘制由4个表示点的有序坐标对定义的贝塞尔样条 }
8、绘制文本,采用Draphics类中的DrawString方法
private void button1_Click(object sender, EventArgs e) { string str = "明日科技 C#编程词典";//定义绘制的字符串 Font myFont = new Font("华文行楷", 20);//实例化Font对象 SolidBrush myBrush = new SolidBrush(Color.DarkOrange);//实例化画刷对象 Graphics myGraphics = this.CreateGraphics();//创建Graphics对象 myGraphics.DrawString(str, myFont, myBrush,10,20);//绘制文本 }
9、绘制公章
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Cachet { public partial class Frm_Main : Form { public Frm_Main() { InitializeComponent(); } Font Var_Font = new Font("Arial", 12, FontStyle.Bold);//定义字符串的字体样式 Rectangle rect = new Rectangle(10, 10, 160, 160);//实例化Rectangle类 private void button1_Click(object sender, EventArgs e) { int tem_Line = 0;//记录圆的直径 int circularity_W = 4;//设置圆画笔的粗细 if (panel1.Width >= panel1.Height)//如果panel1控件的宽度大于等于高度 tem_Line = panel1.Height;//设置高度为圆的直径 else tem_Line = panel1.Width;//设置宽度为圆的直径 rect = new Rectangle(circularity_W, circularity_W, tem_Line - circularity_W * 2, tem_Line - circularity_W * 2);//设置圆的绘制区域 Font star_Font = new Font("Arial", 30, FontStyle.Regular);//设置星号的字体样式 string star_Str = "★"; Graphics g = this.panel1.CreateGraphics();//实例化Graphics类 g.SmoothingMode = SmoothingMode.AntiAlias;//消除绘制图形的锯齿 g.Clear(Color.White);//以白色清空panel1控件的背景 Pen myPen = new Pen(Color.Red, circularity_W);//设置画笔的颜色 g.DrawEllipse(myPen, rect); //绘制圆 SizeF Var_Size = new SizeF(rect.Width, rect.Width);//实例化SizeF类 Var_Size = g.MeasureString(star_Str, star_Font);//对指定字符串进行测量 //要指定的位置绘制星号 g.DrawString(star_Str, star_Font, myPen.Brush, new PointF((rect.Width / 2F) + circularity_W - Var_Size.Width / 2F, rect.Height / 2F - Var_Size.Width / 2F)); Var_Size = g.MeasureString("专用章", Var_Font);//对指定字符串进行测量 //绘制文字 g.DrawString("专用章", Var_Font, myPen.Brush, new PointF((rect.Width / 2F) + circularity_W - Var_Size.Width / 2F, rect.Height / 2F + Var_Size.Height * 2)); string tempStr = "吉林省明日科技有限公司"; int len = tempStr.Length;//获取字符串的长度 float angle = 180 + (180 - len * 20) / 2;//设置文字的旋转角度 for (int i = 0; i < len; i++)//将文字以指定的弧度进行绘制 { //将指定的平移添加到g的变换矩阵前 g.TranslateTransform((tem_Line + circularity_W / 2) / 2, (tem_Line + circularity_W / 2) / 2); g.RotateTransform(angle);//将指定的旋转用于g的变换矩阵 Brush myBrush = Brushes.Red;//定义画刷 g.DrawString(tempStr.Substring(i, 1), Var_Font, myBrush, 60, 0);//显示旋转文字 g.ResetTransform();//将g的全局变换矩阵重置为单位矩阵 angle += 20;//设置下一个文字的角度 } } } }
10、波形图的绘制
private void button1_Click(object sender, EventArgs e) { Graphics graphics = this.CreateGraphics(); //实例化窗体的Graphics类 Pen myPen = new Pen(Color.Black, 1); //设置画笔 int beginX = 50; //定义变量 int beginY = 65; int height = 35; int width = 50; Point pointX1 = new Point(beginX, beginY); Point pointY1 = new Point(beginX + 210, beginY); Point pointX2 = new Point(beginX, beginY - 45); Point pointY2 = new Point(beginX, beginY + 45); //调用DrawLine方法绘制两条垂直相交的直线,用来作为波形图的横纵坐标 graphics.DrawLine(myPen, pointX1, pointY1); graphics.DrawLine(myPen, pointX2, pointY2); graphics.DrawBezier(myPen, beginX, beginY, beginX + 15, beginY - height, beginX + 40, beginY - height, beginX + width, beginY); //绘制上半区域交错连接的贝塞尔曲线 graphics.DrawBezier(myPen, beginX + width, beginY, beginX + width + 15, beginY + height, beginX + width + 40, beginY + height, beginX + width * 2, beginY); //绘制下半区域交错连接的贝塞尔曲线 graphics.DrawBezier(myPen, beginX + width * 2, beginY, beginX + width * 2 + 15, beginY - height, beginX + width * 2 + 40, beginY - height, beginX + width * 3, beginY); //绘制上半区域交错连接的贝塞尔曲线 graphics.DrawBezier(myPen, beginX + width * 3, beginY, beginX + width * 3 + 15, beginY + height, beginX + width * 3 + 40, beginY + height, beginX + width * 4, beginY); //绘制下半区域交错连接的贝塞尔曲线 }
11、绘制图形验证码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace DrawValidateCode { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { CodeImage(CheckCode()); } private string CheckCode() //此方法生成 { int number; char code; string checkCode = String.Empty; //声明变量存储随机生成的4位英文或数字 Random random = new Random(); //生成随机数 for (int i = 0; i < 4; i++) { number = random.Next(); //返回非负随机数 if (number % 2 == 0) //判断数字是否为偶数 code = (char)('0' + (char)(number % 10)); else //如果不是偶数 code = (char)('A' + (char)(number % 26)); checkCode += " " + code.ToString(); //累加字符串 } return checkCode; //返回生成的字符串 } private void CodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 9.5)), 22); Graphics g = Graphics.FromImage(image); //创建Graphics对象 try { Random random = new Random(); //生成随机生成器 g.Clear(Color.White); //清空图片背景色 for (int i = 0; i < 3; i++) //画图片的背景噪音线 { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Black), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold)); g.DrawString(checkCode, font, new SolidBrush(Color.Red), 2, 2); for (int i = 0; i < 150; i++) //画图片的前景噪音点 { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); this.pictureBox1.Width = image.Width; //设置PictureBox的宽度 this.pictureBox1.Height = image.Height; //设置PictureBox的高度 this.pictureBox1.BackgroundImage = image; //设置PictureBox的背景图像 } catch { } } private void button1_Click(object sender, EventArgs e) { CodeImage(CheckCode()); } } }
12、绘制中文验证码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; using System.Drawing.Drawing2D; namespace ChineseCode { public partial class Frm_Main : Form { public Frm_Main() { InitializeComponent(); } public string txt = ""; private void Form1_Load(object sender, EventArgs e) { CreateImage(); } private void CreateImage() { //获取GB2312编码页(表) Encoding gb = Encoding.GetEncoding("gb2312"); //调用函数产生4个随机中文汉字编码 object[] bytes = CreateCode(4); //根据汉字编码的字节数组解码出中文汉字 string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[]))); string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[]))); string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[]))); string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[]))); txt = str1 + str2 + str3 + str4; if (txt == null || txt == String.Empty) { return; } Bitmap image = new Bitmap((int)Math.Ceiling((txt.Length * 20.5)), 22); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音线 for (int i = 0; i < 2; i++) { Point tem_Point_1 = new Point(random.Next(image.Width), random.Next(image.Height)); Point tem_Point_2 = new Point(random.Next(image.Width), random.Next(image.Height)); g.DrawLine(new Pen(Color.Black), tem_Point_1, tem_Point_2); } Font font = new Font("宋体", 12, (FontStyle.Bold)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(txt, font, brush, 2, 2); //画图片的前景噪音点 for (int i = 0; i < 100; i++) { Point tem_point = new Point(random.Next(image.Width),random.Next(image.Height)); image.SetPixel(tem_point.X,tem_point.Y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); pictureBox1.Image = image; } catch { } } /**/ /* 此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 四个字节数组存储在object数组中。 参数:strlength,代表需要产生的汉字个数 */ public static object[] CreateCode(int strlength) { //定义一个字符串数组储存汉字编码的组成元素 string[] r=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}; Random rnd=new Random(); //定义一个object数组用来 object[] bytes=new object[strlength]; /**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 每个汉字有四个区位码组成 区位码第1位和区位码第2位作为字节数组第一个元素 区位码第3位和区位码第4位作为字节数组第二个元素 */ for(int i=0;i<strlength;i++) { //区位码第1位 int r1=rnd.Next(11,14); string str_r1 = r[r1].Trim(); //区位码第2位 rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值 int r2; if (r1==13) r2=rnd.Next(0,7); else r2=rnd.Next(0,16); string str_r2 = r[r2].Trim(); //区位码第3位 rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i); int r3=rnd.Next(10,16); string str_r3 = r[r3].Trim(); //区位码第4位 rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i); int r4; if (r3==10) { r4=rnd.Next(1,16); } else if (r3==15) { r4=rnd.Next(0,15); } else { r4=rnd.Next(0,16); } string str_r4 = r[r4].Trim(); //定义两个字节变量存储产生的随机汉字区位码 byte byte1=Convert.ToByte(str_r1 + str_r2,16); byte byte2=Convert.ToByte(str_r3 + str_r4,16); //将两个字节变量存储在字节数组中 byte[] str_r=new byte[]{byte1,byte2}; //将产生的一个汉字的字节数组放入object数组中 bytes.SetValue(str_r,i); } return bytes; } private void button2_Click(object sender, EventArgs e) { CreateImage(); } private void button1_Click(object sender, EventArgs e) { if (txtCode.Text.Trim() == "") return; else { if (txtCode.Text.Trim() == txt) { MessageBox.Show("提示:验证码输入正确!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } else { MessageBox.Show("提示:验证码输入错误,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } } }
Bitmap类是封装GDI+位图,此位图由图形图像及其特性的像素数据组成,其实用于处理由像素数据定义的图像的对象,位于System.Drawing命名空间下,引用System.Drawing.dll程序集