版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十二章 图形与图像,问题提出 期望效果,课件伴侣,案例分析,主要功能 1、通过工具栏按钮启动、关闭课件伴侣功能。 2、能够选择绘画类型,比如是画直线还是矩形 2、能够调整画笔颜色、宽度、线型。 4、能够实现屏幕放大显示。,技术点 1、屏幕图像的获取(截屏 ) 2、Graphics类使用 3、Pen类使用 4、Image类使用 5、Mouse事件运用,Graphics类,Graphics类 可以将Graphics理解为一块画布,而且它还提供了许多绘画的方法,比如画直线、曲线、显示图片等 : Clear 清除整个绘图面并以指定背景色填充。 CopyFromScreen复制屏幕图像数据。 Draw
2、Ellipse 绘制一个由边框定义的椭圆。 DrawImage 在指定位置并且按原始大小绘制指定的 Image 对象。 DrawLine 绘制一条连接由坐标对指定的两个点的线条。DrawLines绘制一系列连接一组 Point 结构的线段。 DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。 DrawString 在指定位置用指定的Brush和Font对象绘制指定的文本字符串。 FillEllipse 填充边框所定义的椭圆的内部。 FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形的内部。 FromImage 从指定的 Image 对象创建新 Graphic
3、s 对象,Graphics类,创建Graphics对象 : 1、通过Paint事件处理过程中的PaintEventArgs创建Graphics对象 Paint事件当在控件需要被重绘时触发。参数 PaintEventArgs 提供了需要被重新绘制的Graphics对象。例 private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.Graphics; g.DrawString(Paint事件中的Graphics对象, new Font(宋体, 15), Brushes.DarkSeaGreen, new Poi
4、ntF(10, 20); ,Graphics类,2、通过调用可视化控件件的CreateGraphics方法来创建一个Graphics对象 调用CreateGraphics会返回一个Graphics对象。例: private void label1_Click(object sender, EventArgs e) Graphics g = label1.CreateGraphics(); g.DrawIcon(this.Icon, 0, 0); 说明: 第一行代码我们通过调用label1的CreateGraphics方法创建了Graphics对象g。 第二行代码我们调用了Graphics的Dr
5、awIcon方法,该方法用来在Graphics绘制一个指定图标。第一个参数指出要绘制的图标,第二个和第三个参数指出图标绘制的开始位置。,Graphics类,3、从 Image 对象创建 Graphics 类提供了一个方法FromImage,能够根据Image类及其派生类创建Graphics对象。一般用于对包含在Image类及其派生类中的图像进行处理。如: Bitmap b=new Bitmap(ddd.bmp); Graphics g=Graphics.FromImage(b);,Pen,Pen用来绘制直线或曲线。常用属性如下 : Color属性:获取或设置此 Pen 对象的颜色,其类型为Co
6、lor。 Width属性:获取或设置此 Pen 对象的宽度。 Brush属性:获取或设置用于确定此 Pen 对象的属性的 Brush 对象。 DashStyle属性:获取或设置用于通过此 Pen 对象绘制的线型。该属性值为DashStyle 枚举类型。,Pen,DashStyle 的成员: Custom 指定用户定义的自定义划线段样式 线型由DashPattern属性确定 Dash 指定由短划线段组成的线条 DashDot 指定由点划线图案构成的线条 DashDotDot 指定由双点划线图案构成的线条 Dot 指定由点构成的线条 Solid 实线,Pen,示例:在图片框pictureBox1上
7、画一条直线和一个矩形: private void pictureBox1_Paint(object sender, PaintEventArgs e) /创建一支黑色,宽度为2的Pen。 Pen p = new Pen(Color.Black, 2); /得到Graphics对象。 Graphics c =e.Graphics; /设置纤线型为短划线,如果没有设置,默认DashStyle为实线。 p.DashStyle = DashStyle.Dash; /使用Pen画一条直线,参数分别为要使用的Pen对象,直线起点和终点的X、Y坐标。 c.DrawLine(p, 10, 20, 100, 2
8、0); /改变线型为点画线 p.DashStyle = DashStyle.DashDotDot; /使用Pen画一个矩形,参数分别为要使用的Pen对象,矩形的左上角X、Y坐标和矩形的宽度和高度。 c.DrawRectangle(p, 50, 50, 100, 100); ,Brush,画刷用来对一个区域进行填充。Brush是一个抽象类,只能通过使用Brush的子类来使用画刷: SolidBrush(实体画刷) HatchBrush(阴影画刷) LinearGradientBrush(线性渐变画刷) PathGradientBrush(路径渐变画刷) TextureBrush(纹理华刷),屏幕
9、图像的获取(截屏 ),步骤: 1、确定屏幕大小。 Screen.PrimaryScreen.Bounds.Width Screen.PrimaryScreen.Bounds.Height 2、创建位图对象保存屏幕信息 Bitmap Bitmap_Screen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 3、为位图创建Graphics对象 Graphics Graphics_ScreenBitmap = Graphics.FromImage(Bitmap_Screen);
10、,屏幕图像的获取(截屏 ),4、将屏幕复制内容到新的Graphics对象 Graphics_ScreenBitmap.CopyFromScreen(new Point( 0, 0),new Point( 0, 0), Screen.PrimaryScreen.Bounds.Size); 5、显示屏幕截图 pictureBox1.Image = Bitmap_Screen;,图形的绘制,随手画 随手画即以鼠标点击处为起点,随鼠标移动不停地绘制直线,直到鼠标松开。 1、记录鼠标按下位置 /记住绘画起点 private void PictureBox1_MouseDown(object sender
11、, MouseEventArgs e) if (e.Button = MouseButtons.Left)/判断是否按下左键 StartX = e.X; StartY = e.Y; ,图形的绘制,2、在鼠标移动过程中,从起点到当前点画直线。然后重新设置起点为当前鼠标位置 private void PictureBox1_MouseMove(object sender, MouseEventArgs e) int X = e.X; int Y = e.Y; if (e.Button != MouseButtons.Left) return; /未按左键、退出 switch (drawStyle)
12、 case DrawStyle.FreeHand: /随手画 CurrentGraphics.DrawLine(pen, StartX, StartY, X, Y); /画直线 /将当前点设为下一条直线的起点 StartX = X; StartY = Y; pictureBox1.Refresh();/刷新以显示刚绘制的内容 break; ,图形的绘制,直线与橡皮筋效果 直线绘制是指绘制从鼠标按下左键的位置为起点,松开左键的位置为终点的一条直线。 在鼠标移动过程中,需要显示橡皮筋效果。 思路: 在通过CreateGraphics方法得到的Graphics对象上绘制图形,图形会被立即显示但不会保
13、存绘制图形。 在通过FromImae方法创建的Graphics对象上绘制图形,图形可以被保存但不会立即显示。 在鼠标移动过程中在通过CreateGraphics方法得到的Graphics对象上绘制图形,并在绘制下一图形前将其擦除。在鼠标松开时在通过FromImae方法创建的Graphics对象上绘制图形,图形的绘制,在MouseMove事件中绘制直线: case DrawStyle.Line: pictureBox1.Refresh();/刷新清除上一条临时直线 Graphics_PictureBox.DrawLine(pen, StartX, StartY, e.X, e.Y); /绘制直线
14、 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); break; ,屏幕放大,基本思路: 把一个小图像绘制到一个大的尺寸范
15、围中时,就将起到图像放大的效果。 步骤: 1、创建一个大小为屏幕2倍Bitmap位图对象Zoom_Bitmap_Screen: Zoom_Bitmap_Screen = new Bitmap(Screen.PrimaryScreen.Bounds.Width * 2, Screen.PrimaryScreen.Bounds.Height * 2); 2、获取Zoom_Bitmap_Screen的Graphics对象: Zoom_Graphics_ScreenBitmap = Graphics.FromImage(Zoom_Bitmap_Screen); 3、将保存有屏幕原始内容的Bitmap_
16、Screen位图绘制到Zoom_Graphics_ScreenBitmap上,注意在绘制时目标宽度和高度都为屏幕大小的2倍。,屏幕放大,Zoom_Graphics_ScreenBitmap.DrawImage(Bitmap_Screen, 0, 0, Screen.PrimaryScreen.Bounds.Width* 2,Screen.PrimaryScreen.Bounds.Height * 2); 4、放大状态下图形绘制一定要使用Zoom_Graphics_ScreenBitmap,所以这里要改变当前要使用的Graphics对象: CurrentGraphics =Zoom_Graphi
17、cs_ScreenBitmap; 5、改变picture1Box1的Image属性,以便显示放大的位图: picture1Box1.Image=Zoom_Bitmap_Screen 6、最初picture1Box1的大小适合屏幕大小相同的。但现在picture1Box1里的Image大小已经是原来的2倍了,所以将picture1Box1的大小也进行调整,使得其与位图Zoom_Bitmap_Screen大小相同: picture1Box1.Size=Zoom_Bitmap_Screen.Size;,图形漫游,思路: 由于放大的屏幕图像是放在picture1Box1之中,我们只需改变picture
18、1Box1的Left和Top属性来移动picture1Box1,就可以显示出被遮挡部分。 步骤: 1、设置空白键状态变量。 2、记录鼠标按下的位置。 3、在MoeseMove事件中。检查空白键是否按下。并根据鼠标和picture1Box1位置决定移动方向和距离。,图形漫游,空白键状态变量设置: 1、在有键按下时: private void frmMain_KeyDown(object sender, KeyEventArgs e) if (e.KeyCode = Keys.Space) /如果是空格键 IsSpacePressed = true; /空格键按下标记为true 2、按键松开,设置
19、空格键按下标记为false private void frmMain_KeyUp(object sender, KeyEventArgs e) IsSpacePressed = false; ,图形漫游,记录鼠标按下的位置。 private void PictureBox1_MouseDown(object sender, MouseEventArgs e) if (e.Button = MouseButtons.Left)/判断是否按下左键 StartX = e.X; StartY = e.Y; ,图形漫游,3、MoeseMove事件中的相关代码: if (IsSpacePressed) /
20、按下了空格键,为图像漫游 /如果新位置Let属性大于0,左边会出现空白区域,因此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.Left + (X - StartX) Width - pic
21、tureBox1.Width) pictureBox1.Left = Width - pictureBox1.Width; else pictureBox1.Left = pictureBox1.Left + (X - StartX);,图形漫游,/控制Top属性的最小值和最大值 if (pictureBox1.Top + (Y - StartY) 0) pictureBox1.Top = 0; else if (pictureBox1.Top + (Y - StartY) Height - pictureBox1.Height) pictureBox1.Top = Height - pict
22、ureBox1.Height; else pictureBox1.Top = pictureBox1.Top + (Y - StartY); return; ,工具栏的制作,思路: 将一个ToolStrip控件放置于一个新窗体之中,窗体的大小和工具栏大小相同。 使用一个Timer组件使窗口上移,使用另一个Timer组件使窗口下移 在MouseEnter事件中激活使窗口下移的Timer组件。在MouseLeave事件中激活使窗口上移的Timer组件,工具栏的制作,1、Top逐渐减小,即工具栏上移。if语句判断是否Top太小,要保证底端至少12像素高度出现在屏幕上。 private void ti
23、mer1_Tick(object sender, EventArgs e) if (Top 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控件,工具栏上移 private void toolStrip1_MouseEnter(object sender, EventArgs e) timer2.Enable
24、d = true; timer1.Enabled = false; 4、激活timer1控件,工具栏上移 private void toolStrip1_MouseLeave(object sender, EventArgs e) timer1.Enabled = true; timer2.Enabled = false; ,路径GraphicsPath,1、路径的创建 GraphicsPath p = new GraphicsPath(); Point A=new Point(10,10); Point B=new Point(100,10); p.AddLine(new Point(10,
25、10), new Point(10,10); p.AddRectangle(new Rectangle(AcceptButton,new Size(30,100); 2、绘制路径 e.Graphics.DrawPath(new Pen(Color.Red), p); 3、路径填充 e.Graphics.FillPath(new SolidBrush(Color.Red), p);,区域,1、区域的创建 GraphicsPath p = new GraphicsPath(); p.AddString(文字区域, new FontFamily(宋体), (int)FontStyle.Bold, 1
26、00.0f, new Point(10, 10), new StringFormat(); Region r = new Region(p); 2、区域的填充 e.Graphics.FillRegion(Brushes.Blue, r); 3、区域的剪裁效果 this.Region=r;,坐标变换,坐标系类型 : 1、世界坐标是用于建立特殊图形世界模型的坐标系,也是在 .NET Framework 中传递给方法的坐标系。 2、页面坐标系是指绘图图面(如窗体或控件)使用的坐标系。 3、设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系。,坐标变换,平移变换 myGraphics.
27、TranslateTransform(100, 50); myGraphics.DrawLine(myPen, 0, 0, 160, 80);,坐标变换,旋转与缩放 RotateTransform方用来旋转坐标系 声明: public void RotateTransform(float angle); 参数: angle为要旋转的角度,以度为单位。 ScaleTransform方法用来缩放坐标系 声明: public void ScaleTransform(float sx, float sy); 参数: sx为X方向上缩放因子 sy为Y方向缩放因子。,坐标变换,示例: private vo
28、id Form1_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.ResetTransform();/恢复原是坐标系 /
29、设置放大因子,X坐标为原来的0.3倍,Y坐标为原来的2倍 e.Graphics.ScaleTransform(0.3f,2); e.Graphics.FillRectangle(b, 100, 50, 100, 40); /填充矩形 ,色彩变换,对图片实现像素处理 1、 获取位图指定点颜色 public Color GetPixel(int x, int y); 2、设置位图指点点颜色 public void SetPixel(int x, int y, Color 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,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中小学安全管理条例知识竞赛试题及答案
- 校长在教师例会上精彩讲话:把教学常规做到位教好孩子也提升自己
- 2026年知识产权管理体系认证审核员备考
- 2026年志愿服务管理专干考试题库及答案
- 计算机系统崩溃紧急恢复操作手册IT部门预案
- 文档处理自动工具及文件命名模板
- 2026年聊城市公安局招聘警务辅助人员笔试试题(含答案)
- 研究诚信承诺书科技前沿领域(3篇)
- 幼儿园安全管理与紧急预案指导书
- 2026年离退休干部服务岗遴选试题及答案
- 河道断面测量方案
- 2024年10月自考13000英语专升本试题及答案含评分参考
- Fotona口腔激光治疗仪
- T-CPA 006-2024 造纸用湿强剂 聚酰胺环氧氯丙烷PAE
- 广东省普通高中学生档案
- 《小儿过敏性休克》课件
- 山东省蔬菜出口到日本地区的现状及发展的对策
- 组织措施方案
- 健康体检主检报告的内涵
- WPS Office办公应用案例教程
- 车辆技术档案范本(一车一档)
评论
0/150
提交评论