第12章 图形及图像_第1页
第12章 图形及图像_第2页
第12章 图形及图像_第3页
第12章 图形及图像_第4页
第12章 图形及图像_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual C# Visual C# 案例教程案例教程l问题提出问题提出l期望效果期望效果主要功能主要功能1 1、通过工具栏按钮启动、关、通过工具栏按钮启动、关闭课件伴侣功能。闭课件伴侣功能。2 2、能够选择绘画类型,比如、能够选择绘画类型,比如是画直线还是矩形是画直线还是矩形2 2、能够调整画笔颜色、宽度、能够调整画笔颜色、宽度、线型。线型。4 4、能够实现屏幕放大显示、能够实现屏幕放大显示。技术点技术点1 1、屏幕图像的获取、屏幕图像的获取( (截屏截屏 )2 2、GraphicsGraphics类类使用使用3 3、PenPen类使用类使用4 4、ImageImage类使用类使用5 5、

2、MouseMouse事件运用事件运用lGraphics类可以将Graphics理解为一块画布,而且它还提供了许多绘画的方法,比如画直线、曲线、显示图片等 :Clear 清除整个绘图面并以指定背景色填充。CopyFromScreen复制屏幕图像数据。DrawEllipse 绘制一个由边框定义的椭圆。DrawImage 在指定位置并且按原始大小绘制指定的 Image 对象。DrawLine 绘制一条连接由坐标对指定的两个点的线条。DrawLines绘制一系列连接一组 Point 结构的线段。DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。DrawString 在指定位置用指定的Br

3、ush和Font对象绘制指定的文本字符串。FillEllipse 填充边框所定义的椭圆的内部。FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形的内部。FromImage 从指定的 Image 对象创建新 Graphics 对象创建Graphics对象 :1、通过Paint事件处理过程中的PaintEventArgs创建Graphics对象Paint事件当在控件需要被重绘时触发。参数 PaintEventArgs 提供了需要被重新绘制的Graphics对象。例private void Form1_Paint(object sender, PaintEventArgs e)

4、 Graphics g = e.Graphics; g.DrawString(Paint事件中的Graphics对象, new Font(宋体, 15), Brushes.DarkSeaGreen, new PointF(10, 20);2、通过调用可视化控件件的CreateGraphics方法来创建一个Graphics对象调用CreateGraphics会返回一个Graphics对象。例:private void label1_Click(object sender, EventArgs e) Graphics g = label1.CreateGraphics(); g.DrawIcon(

5、this.Icon, 0, 0); 说明:第一行代码我们通过调用label1的CreateGraphics方法创建了Graphics对象g。第二行代码我们调用了Graphics的DrawIcon方法,该方法用来在Graphics绘制一个指定图标。第一个参数指出要绘制的图标,第二个和第三个参数指出图标绘制的开始位置。3、从 Image 对象创建Graphics 类提供了一个方法FromImage,能够根据Image类及其派生类创建Graphics对象。一般用于对包含在Image类及其派生类中的图像进行处理。如:Bitmap b=new Bitmap(ddd.bmp);Graphics g=Gra

6、phics.FromImage(b);lPen用来绘制直线或曲线。常用属性如下用来绘制直线或曲线。常用属性如下 :ColorColor属性:获取或设置此属性:获取或设置此 Pen Pen 对象的颜色,其对象的颜色,其类型为类型为ColorColor。WidthWidth属性:获取或设置此属性:获取或设置此 Pen Pen 对象的宽度。对象的宽度。BrushBrush属性:获取或设置用于确定此属性:获取或设置用于确定此 Pen Pen 对象的对象的属性的属性的 Brush Brush 对象。对象。DashStyleDashStyle属性:获取或设置用于通过此属性:获取或设置用于通过此 Pen P

7、en 对对象绘制的线型。该属性值为象绘制的线型。该属性值为DashStyle DashStyle 枚举类型。枚举类型。lDashStyle 的成员:的成员:Custom Custom 指定用户定义的自定义划线段样式指定用户定义的自定义划线段样式线型由线型由DashPatternDashPattern属性确定属性确定 Dash Dash 指定由短划线段组成的线条指定由短划线段组成的线条DashDot DashDot 指定由点划线图案构成的线条指定由点划线图案构成的线条DashDotDot DashDotDot 指定由双点划线图案构成的线条指定由双点划线图案构成的线条Dot Dot 指定由点构成的

8、线条指定由点构成的线条Solid Solid 实线实线l示例:在图片框示例:在图片框pictureBox1上画一条直线和一个矩形:上画一条直线和一个矩形:private void pictureBox1_Paint(object sender, PaintEventArgs e) /创建一支黑色,宽度为创建一支黑色,宽度为2 2的的PenPen。Pen p = new Pen(Color.Black, 2); Pen p = new Pen(Color.Black, 2); / /得到得到GraphicsGraphics对象。对象。Graphics c =e.Graphics; Graphic

9、s c =e.Graphics; /设置纤线型为短划线,如果没有设置,默认设置纤线型为短划线,如果没有设置,默认DashStyleDashStyle为实线。为实线。p.DashStyle = DashStyle.Dash; p.DashStyle = DashStyle.Dash; /使用使用PenPen画一条直线,参数分别为要使用的画一条直线,参数分别为要使用的PenPen对象,直线起点和终点的对象,直线起点和终点的X X、Y Y坐标。坐标。c.DrawLine(p, 10, 20, 100, 20); c.DrawLine(p, 10, 20, 100, 20); /改变线型为点画线改变线

10、型为点画线p.DashStyle = DashStyle.DashDotDot;p.DashStyle = DashStyle.DashDotDot;/使用使用PenPen画一个矩形,参数分别为要使用的画一个矩形,参数分别为要使用的PenPen对象,矩形的左上角对象,矩形的左上角X X、Y Y坐标和矩形的坐标和矩形的宽度和高度。宽度和高度。 c.DrawRectangle(p, 50, 50, 100, 100); c.DrawRectangle(p, 50, 50, 100, 100); l画刷用来对一个区域进行填充。画刷用来对一个区域进行填充。Brush是一个是一个抽象类,只能通过使用抽象

11、类,只能通过使用Brush的子类的子类 来使用来使用画刷:画刷: SolidBrushSolidBrush(实体画刷)(实体画刷)HatchBrushHatchBrush(阴影画刷)(阴影画刷)LinearGradientBrushLinearGradientBrush(线性渐变画刷)(线性渐变画刷)PathGradientBrushPathGradientBrush(路径渐变画刷)(路径渐变画刷)TextureBrushTextureBrush(纹理华刷)(纹理华刷)l步骤:步骤:1 1、确定屏幕大小。、确定屏幕大小。 Screen.PrimaryScreen.Bounds.Width Sc

12、reen.PrimaryScreen.Bounds.Height2 2、创建位图对象保存屏幕信息、创建位图对象保存屏幕信息 Bitmap Bitmap_Screen = new Bitmap Bitmap_Screen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);Screen.PrimaryScreen.Bounds.Height);3 3、为位图创建、为位图创建GraphicsGraph

13、ics对象对象Graphics Graphics_ScreenBitmap = Graphics Graphics_ScreenBitmap = Graphics.FromImage(Bitmap_Screen); Graphics.FromImage(Bitmap_Screen); 4 4、将屏幕复制内容到新的、将屏幕复制内容到新的GraphicsGraphics对象对象Graphics_ScreenBitmap.CopyFromScreen(new Graphics_ScreenBitmap.CopyFromScreen(new Point( 0, 0),new Point( 0, 0),

14、 Point( 0, 0),new Point( 0, 0), Screen.PrimaryScreen.Bounds.Size);Screen.PrimaryScreen.Bounds.Size);5 5、显示屏幕截图、显示屏幕截图pictureBox1.Image = Bitmap_Screen;pictureBox1.Image = Bitmap_Screen;l随手画随手画 随手画即以鼠标点击处为起点,随鼠标移动不停地绘制直线,随手画即以鼠标点击处为起点,随鼠标移动不停地绘制直线,直到鼠标松开。直到鼠标松开。1 1、记录鼠标按下位置、记录鼠标按下位置 /记住绘画起点记住绘画起点priv

15、ate void PictureBox1_MouseDown(object sender, private void PictureBox1_MouseDown(object sender, MouseEventArgs e)MouseEventArgs e) if (e.Button = MouseButtons.Left)/ if (e.Button = MouseButtons.Left)/判断是否按下左键判断是否按下左键 StartX = e.X; StartX = e.X; StartY = e.Y; StartY = e.Y; 2 2、在鼠标移动过程中,从起点到当前点画直线。然后重

16、新设置起点为当前、在鼠标移动过程中,从起点到当前点画直线。然后重新设置起点为当前鼠标位置鼠标位置private void PictureBox1_MouseMove(object sender, MouseEventArgs e)private void PictureBox1_MouseMove(object sender, MouseEventArgs e) int X = e.X; int Y = e.Y; int X = e.X; int Y = e.Y; if (e.Button != MouseButtons.Left) return; if (e.Button != MouseB

17、uttons.Left) return; /未按左键、退出未按左键、退出 switch (drawStyle) switch (drawStyle) case DrawStyle.FreeHand: case DrawStyle.FreeHand: /随手画随手画 CurrentGraphics.DrawLine(pen, StartX, StartY, X, Y); CurrentGraphics.DrawLine(pen, StartX, StartY, X, Y); /画直线画直线 /将当前点设为下一条直线的起点将当前点设为下一条直线的起点 StartX = X; StartY = Y;

18、StartX = X; StartY = Y; pictureBox1.Refresh(); pictureBox1.Refresh();/刷新以显示刚绘制的内容刷新以显示刚绘制的内容 break;break; l直线与橡皮筋效果直线与橡皮筋效果直线绘制是指绘制从鼠标按下左键的位置为起点,松开左键的位置直线绘制是指绘制从鼠标按下左键的位置为起点,松开左键的位置为终点的一条直线。为终点的一条直线。 在鼠标移动过程中,需要显示橡皮筋效果。在鼠标移动过程中,需要显示橡皮筋效果。思路:思路:在通过在通过CreateGraphicsCreateGraphics方法得到的方法得到的GraphicsGrap

19、hics对象上绘制图形,图形对象上绘制图形,图形会被立即显示但不会保存绘制图形。会被立即显示但不会保存绘制图形。在通过在通过FromImaeFromImae方法创建的方法创建的GraphicsGraphics对象上绘制图形,图形可以被对象上绘制图形,图形可以被保存但不会立即显示。保存但不会立即显示。在鼠标移动过程中在通过在鼠标移动过程中在通过CreateGraphicsCreateGraphics方法得到的方法得到的GraphicsGraphics对象对象上绘制图形,并在绘制下一图形前将其擦除。在鼠标松开时在通过上绘制图形,并在绘制下一图形前将其擦除。在鼠标松开时在通过FromImaeFrom

20、Imae方法创建的方法创建的GraphicsGraphics对象上绘制图形对象上绘制图形在在MouseMove事件中绘制直线:事件中绘制直线:case DrawStyle.Line:case DrawStyle.Line: pictureBox1.Refresh pictureBox1.Refresh();/();/刷新清除上一条临时直线刷新清除上一条临时直线 Graphics_PictureBox.DrawLine(pen, StartX, Graphics_PictureBox.DrawLine(pen, StartX, StartY, e.X, e.Y); StartY, e.X, e.

21、Y); /绘制直线绘制直线 break;break; 当鼠标松开时:当鼠标松开时: private void PictureBox1_MouseUp(object sender, MouseEventArgs e) if (e.Button != MouseButtons.Left) return; /不是左键,退出不是左键,退出 int X = e.X; int Y = e.Y; switch (drawStyle)case DrawStyle.Line: CurrentGraphics.DrawLine(pen, StartX, StartY, X, Y);CurrentGraphics.

22、DrawLine(pen, StartX, StartY, X, Y);break;break; l基本思路:基本思路:把一个小图像绘制到一个大的尺寸范围中时,就将起到图像把一个小图像绘制到一个大的尺寸范围中时,就将起到图像放大的效果。放大的效果。l步骤:步骤:1 1、创建一个大小为屏幕、创建一个大小为屏幕2 2倍倍BitmapBitmap位图对象位图对象Zoom_Bitmap_ScreenZoom_Bitmap_Screen:Zoom_Bitmap_Screen = new Zoom_Bitmap_Screen = new Bitmap(Screen.PrimaryScreen.Bounds

23、.Width Bitmap(Screen.PrimaryScreen.Bounds.Width * * 2, 2, Screen.PrimaryScreen.Bounds.Height Screen.PrimaryScreen.Bounds.Height * * 2); 2);2 2、获取、获取Zoom_Bitmap_ScreenZoom_Bitmap_Screen的的GraphicsGraphics对象:对象:Zoom_Graphics_ScreenBitmap = Zoom_Graphics_ScreenBitmap = Graphics.FromImage(Zoom_Bitmap_Scr

24、een);Graphics.FromImage(Zoom_Bitmap_Screen);3 3、将保存有屏幕原始内容的、将保存有屏幕原始内容的Bitmap_ScreenBitmap_Screen位图绘制到位图绘制到Zoom_Graphics_ScreenBitmapZoom_Graphics_ScreenBitmap上,注意在绘制时目标宽度和高度都上,注意在绘制时目标宽度和高度都为屏幕大小的为屏幕大小的2 2倍。倍。Zoom_Graphics_ScreenBitmap.DrawImage(Bitmap_Screen, 0, 0, Zoom_Graphics_ScreenBitmap.DrawI

25、mage(Bitmap_Screen, 0, 0, Screen.PrimaryScreen.Bounds.WidthScreen.PrimaryScreen.Bounds.Width* * 2,Screen.PrimaryScreen.Bounds.Height 2,Screen.PrimaryScreen.Bounds.Height * * 2); 2);4 4、放大状态下图形绘制一定要使用、放大状态下图形绘制一定要使用Zoom_Graphics_ScreenBitmapZoom_Graphics_ScreenBitmap,所以这里要改变当前要使用的所以这里要改变当前要使用的Graphic

26、sGraphics对象:对象:CurrentGraphics =Zoom_Graphics_ScreenBitmap;CurrentGraphics =Zoom_Graphics_ScreenBitmap;5 5、改变、改变picture1Box1picture1Box1的的ImageImage属性属性, ,以便显示放大的位图:以便显示放大的位图:picture1Box1.Image=Zoom_Bitmap_Screenpicture1Box1.Image=Zoom_Bitmap_Screen6 6、最初、最初picture1Box1picture1Box1的大小适合屏幕大小相同的。但现在的大

27、小适合屏幕大小相同的。但现在picture1Box1picture1Box1里的里的ImageImage大小已经是原来的大小已经是原来的2 2倍了,所以将倍了,所以将picture1Box1picture1Box1的大小也进行调整的大小也进行调整, ,使得其与位图使得其与位图Zoom_Bitmap_ScreenZoom_Bitmap_Screen大小相同:大小相同:picture1Box1.Size=Zoom_Bitmap_Screen.Size;picture1Box1.Size=Zoom_Bitmap_Screen.Size;l思路:思路:由于放大的屏幕图像是放在由于放大的屏幕图像是放在p

28、icture1Box1之中,之中,我们只需改变我们只需改变picture1Box1的的Left和和Top属性来移动属性来移动picture1Box1,就可以显示出被遮挡部分。,就可以显示出被遮挡部分。步骤:步骤:1 1、设置空白键状态变量。、设置空白键状态变量。2 2、记录鼠标按下的位置。、记录鼠标按下的位置。3 3、在、在MoeseMoveMoeseMove事件中。检查空白键是否按下。并根据事件中。检查空白键是否按下。并根据鼠标和鼠标和picture1Box1picture1Box1位置决定移动方向和距离。位置决定移动方向和距离。l空白键状态变量设置:空白键状态变量设置:1、在有键按下时:、

29、在有键按下时:private void frmMain_KeyDown(object sender, KeyEventArgs e)private void frmMain_KeyDown(object sender, KeyEventArgs e) if (e.KeyCode = Keys.Space) if (e.KeyCode = Keys.Space) /如果是空格键如果是空格键 IsSpacePressed = true; IsSpacePressed = true; /空格键按下标记为空格键按下标记为truetrue 2 2、按键松开,设置空格键按下标记为、按键松开,设置空格键按下

30、标记为falsefalseprivate void frmMain_KeyUp(object sender, KeyEventArgs e)private void frmMain_KeyUp(object sender, KeyEventArgs e) IsSpacePressed = false; IsSpacePressed = false; l记录鼠标按下的位置。记录鼠标按下的位置。private void PictureBox1_MouseDown(object sender, private void PictureBox1_MouseDown(object sender, Mou

31、seEventArgs e)MouseEventArgs e) if (e.Button = MouseButtons.Left if (e.Button = MouseButtons.Left)/)/判断是否按判断是否按下左键下左键 StartX = e.X; StartX = e.X; StartY = e.Y; StartY = e.Y; l3 3、MoeseMoveMoeseMove事件中的相关代码:事件中的相关代码:if (IsSpacePressed) /按下了空格键,为图像漫游按下了空格键,为图像漫游 /如果新位置如果新位置Let属性大于属性大于0,左边会出现空白区域,左边会出现

32、空白区域,因此因此Left属性最大值为属性最大值为0。/X为鼠标当前位置为鼠标当前位置X坐标,坐标,StartX为鼠标左键按下(即开始漫游)时的为鼠标左键按下(即开始漫游)时的X坐标。坐标。 if (pictureBox1.Left + (X - StartX) 0) pictureBox1.Left = 0;/如果新位置如果新位置Let属性小于窗体宽度属性小于窗体宽度Width - pictureBox1.Width,/右边会出现空白区域右边会出现空白区域,因此因此Left属性最小值为属性最小值为Width - pictureBox1.Width。 else if (pictureBox1.

33、Left + (X - StartX) 0) pictureBox1.Top = 0; else if (pictureBox1.Top + (Y - StartY) 12 - Height) this.Top-;2、Top逐渐增大,即工具栏下移。逐渐增大,即工具栏下移。if语句判断是否语句判断是否Top太大,太大,Top最大值为最大值为0,保证工具栏位于屏幕上端,保证工具栏位于屏幕上端private void timer2_Tick(object sender, EventArgs e) if (Top 0) this.Top+;3、激活、激活timer2控件,工具栏上移控件,工具栏上移pr

34、ivate void toolStrip1_MouseEnter(object sender, EventArgs e) timer2.Enabled = true; timer1.Enabled = false; 4、激活、激活timer1控件,工具栏上移控件,工具栏上移private void toolStrip1_MouseLeave(object sender, EventArgs e) timer1.Enabled = true; timer2.Enabled = false; l1、路径的创建、路径的创建GraphicsPath p = new GraphicsPath();Poi

35、nt A=new Point(10,10);Point B=new Point(100,10);p.AddLine(new Point(10,10), new Point(10,10); p.AddRectangle(new Rectangle(AcceptButton,new Size(30,100);l2、绘制路径、绘制路径e.Graphics.DrawPath(new Pen(Color.Red), p);l3、路径填充、路径填充 e.Graphics.FillPath(new SolidBrush(Color.Red), p); l1、区域的创建、区域的创建GraphicsPath p

36、 = new GraphicsPath();GraphicsPath p = new GraphicsPath();p.AddString(p.AddString(文字区域文字区域, new FontFamily(, new FontFamily(宋体宋体), ), (int)FontStyle.Bold, 100.0f, new Point(10, 10), (int)FontStyle.Bold, 100.0f, new Point(10, 10), new StringFormat();new StringFormat();Region r = new Region(p);Region

37、r = new Region(p);l2、区域的填充、区域的填充e.Graphics.FillRegion(Brushes.Blue, r); e.Graphics.FillRegion(Brushes.Blue, r); l3、区域的剪裁效果、区域的剪裁效果this.Region=r;l 坐标系类型坐标系类型 :1 1、世界坐标是用于建立特殊图形世界模型的坐、世界坐标是用于建立特殊图形世界模型的坐标系,也是在标系,也是在 .NET Framework .NET Framework 中传递给方法中传递给方法的坐标系。的坐标系。2 2、页面坐标系是指绘图图面(如窗体或控件)、页面坐标系是指绘图图

38、面(如窗体或控件)使用的坐标系。使用的坐标系。3 3、设备坐标系是在其上进行绘制的物理设备、设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系。(如屏幕或纸张)所使用的坐标系。 l平移变换平移变换 myGraphics.TranslateTransform(100, 50);myGraphics.DrawLine(myPen, 0, 0, 160, 80);l旋转与缩放旋转与缩放RotateTransformRotateTransform方用来旋转坐标系方用来旋转坐标系声明:声明:public void RotateTransform(float angle);public v

39、oid RotateTransform(float angle);参数:参数:angleangle为要旋转的角度,以度为单位。为要旋转的角度,以度为单位。ScaleTransformScaleTransform方法用来缩放坐标系方法用来缩放坐标系声明:声明:public void ScaleTransform(float sx, float sy);public void ScaleTransform(float sx, float sy);参数参数: :sxsx为为X X方向上缩放因子方向上缩放因子sysy为为Y Y方向缩放因子。方向缩放因子。示例:示例:private void Form1

40、_Paint(object sender, PaintEventArgs e) /创建半透明红色画刷创建半透明红色画刷 Brush b=new SolidBrush (Color.FromArgb(125,Color.Red); e.Graphics.FillRectangle(b, 100, 50, 100, 40); /填充矩形填充矩形 e.Graphics.RotateTransform(30); /坐标系旋转坐标系旋转30度度 e.Graphics.FillRectangle(b, 100, 50, 100, 40); /填充矩形填充矩形 e.Graphics.ResetTransfo

41、rm();/恢复原是坐标系恢复原是坐标系 /设置放大因子,设置放大因子,X坐标为原来的坐标为原来的0.3倍,倍,Y坐标为原来的坐标为原来的2倍倍 e.Graphics.ScaleTransform(0.3f,2); e.Graphics.FillRectangle(b, 100, 50, 100, 40); /填充矩形填充矩形l对图片实现像素处理对图片实现像素处理1、 获取位图指定点颜色获取位图指定点颜色public Color GetPixel(int x, int y);2、设置位图指点点颜色、设置位图指点点颜色 public void SetPixel(int x, int y, Col

42、or color);示例:示例:/创建新位图,内容为创建新位图,内容为OldImage中的内容。中的内容。Bitmap允许对每允许对每个像素进行操作个像素进行操作 b = new Bitmap(OldImage); for (int i = 0; i b.Width; i+) for (int j = 0; j b.Height; j+) Color c1 = b.GetPixel(i, j); /根据原始颜色和轨迹条的值重新生成新颜色根据原始颜色和轨迹条的值重新生成新颜色 Color c2 = Color.FromArgb(c1.R * trackBar1.Value / 100, c1.G * trackBar1.Value / 100, c1.B * trackBar1.Value / 100); b.SetPixel(i, j, c2); /设置像素点新

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论