《第12章图形与图像.ppt》由会员分享,可在线阅读,更多相关《第12章图形与图像.ppt(40页珍藏版)》请在三一办公上搜索。
1、第十二章 图形与图像,问题提出期望效果,课件伴侣,案例分析,主要功能1、通过工具栏按钮启动、关闭课件伴侣功能。2、能够选择绘画类型,比如是画直线还是矩形2、能够调整画笔颜色、宽度、线型。4、能够实现屏幕放大显示。,技术点1、屏幕图像的获取(截屏)2、Graphics类使用3、Pen类使用4、Image类使用5、Mouse事件运用,Graphics类,Graphics类可以将Graphics理解为一块画布,而且它还提供了许多绘画的方法,比如画直线、曲线、显示图片等:Clear 清除整个绘图面并以指定背景色填充。CopyFromScreen复制屏幕图像数据。DrawEllipse 绘制一个由边框定
2、义的椭圆。DrawImage 在指定位置并且按原始大小绘制指定的 Image 对象。DrawLine 绘制一条连接由坐标对指定的两个点的线条。DrawLines绘制一系列连接一组 Point 结构的线段。DrawRectangle 绘制由坐标对、宽度和高度指定的矩形。DrawString 在指定位置用指定的Brush和Font对象绘制指定的文本字符串。FillEllipse 填充边框所定义的椭圆的内部。FillRectangle 填充由一对坐标、一个宽度和一个高度指定的矩形的内部。FromImage 从指定的 Image 对象创建新 Graphics 对象,Graphics类,创建Graphi
3、cs对象: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 PointF(10,20);,Graphics类,2、通过调用可视化控件件的C
4、reateGraphics方法来创建一个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的DrawIcon方法,该方法用来在Graphics绘制一个指定图标。第一个参数指出要绘制的图标,第二个和
5、第三个参数指出图标绘制的开始位置。,Graphics类,3、从 Image 对象创建Graphics 类提供了一个方法FromImage,能够根据Image类及其派生类创建Graphics对象。一般用于对包含在Image类及其派生类中的图像进行处理。如:Bitmap b=new Bitmap(ddd.bmp);Graphics g=Graphics.FromImage(b);,Pen,Pen用来绘制直线或曲线。常用属性如下:Color属性:获取或设置此 Pen 对象的颜色,其类型为Color。Width属性:获取或设置此 Pen 对象的宽度。Brush属性:获取或设置用于确定此 Pen 对象的
6、属性的 Brush 对象。DashStyle属性:获取或设置用于通过此 Pen 对象绘制的线型。该属性值为DashStyle 枚举类型。,Pen,DashStyle 的成员:Custom 指定用户定义的自定义划线段样式线型由DashPattern属性确定 Dash 指定由短划线段组成的线条DashDot 指定由点划线图案构成的线条DashDotDot 指定由双点划线图案构成的线条Dot 指定由点构成的线条Solid 实线,Pen,示例:在图片框pictureBox1上画一条直线和一个矩形:private void pictureBox1_Paint(object sender,PaintEve
7、ntArgs 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,20);/改变线型为点画线p.DashStyle=DashStyle.DashDotDot;/使用Pen画一个矩形,参数分别为要使用的Pen对象,矩形的左上角X、Y坐标和
8、矩形的宽度和高度。c.DrawRectangle(p,50,50,100,100);,Brush,画刷用来对一个区域进行填充。Brush是一个抽象类,只能通过使用Brush的子类来使用画刷:SolidBrush(实体画刷)HatchBrush(阴影画刷)LinearGradientBrush(线性渐变画刷)PathGradientBrush(路径渐变画刷)TextureBrush(纹理华刷),屏幕图像的获取(截屏),步骤:1、确定屏幕大小。Screen.PrimaryScreen.Bounds.Width Screen.PrimaryScreen.Bounds.Height2、创建位图对象保存
9、屏幕信息 Bitmap Bitmap_Screen=new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height);3、为位图创建Graphics对象Graphics Graphics_ScreenBitmap=Graphics.FromImage(Bitmap_Screen);,屏幕图像的获取(截屏),4、将屏幕复制内容到新的Graphics对象Graphics_ScreenBitmap.CopyFromScreen(new Point(0,0),new Point(0,0),Screen.Pr
10、imaryScreen.Bounds.Size);5、显示屏幕截图pictureBox1.Image=Bitmap_Screen;,图形的绘制,随手画 随手画即以鼠标点击处为起点,随鼠标移动不停地绘制直线,直到鼠标松开。1、记录鼠标按下位置/记住绘画起点private void PictureBox1_MouseDown(object sender,MouseEventArgs e)if(e.Button=MouseButtons.Left)/判断是否按下左键 StartX=e.X;StartY=e.Y;,图形的绘制,2、在鼠标移动过程中,从起点到当前点画直线。然后重新设置起点为当前鼠标位置p
11、rivate void PictureBox1_MouseMove(object sender,MouseEventArgs e)int X=e.X;int Y=e.Y;if(e.Button!=MouseButtons.Left)return;/未按左键、退出 switch(drawStyle)case DrawStyle.FreeHand:/随手画 CurrentGraphics.DrawLine(pen,StartX,StartY,X,Y);/画直线/将当前点设为下一条直线的起点 StartX=X;StartY=Y;pictureBox1.Refresh();/刷新以显示刚绘制的内容 b
12、reak;,图形的绘制,直线与橡皮筋效果直线绘制是指绘制从鼠标按下左键的位置为起点,松开左键的位置为终点的一条直线。在鼠标移动过程中,需要显示橡皮筋效果。思路:在通过CreateGraphics方法得到的Graphics对象上绘制图形,图形会被立即显示但不会保存绘制图形。在通过FromImae方法创建的Graphics对象上绘制图形,图形可以被保存但不会立即显示。在鼠标移动过程中在通过CreateGraphics方法得到的Graphics对象上绘制图形,并在绘制下一图形前将其擦除。在鼠标松开时在通过FromImae方法创建的Graphics对象上绘制图形,图形的绘制,在MouseMove事件中
13、绘制直线:case DrawStyle.Line:pictureBox1.Refresh();/刷新清除上一条临时直线 Graphics_PictureBox.DrawLine(pen,StartX,StartY,e.X,e.Y);/绘制直线 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
14、DrawStyle.Line:CurrentGraphics.DrawLine(pen,StartX,StartY,X,Y);break;,屏幕放大,基本思路:把一个小图像绘制到一个大的尺寸范围中时,就将起到图像放大的效果。步骤: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_
15、Graphics_ScreenBitmap=Graphics.FromImage(Zoom_Bitmap_Screen);3、将保存有屏幕原始内容的Bitmap_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_G
16、raphics_ScreenBitmap,所以这里要改变当前要使用的Graphics对象:CurrentGraphics=Zoom_Graphics_ScreenBitmap;5、改变picture1Box1的Image属性,以便显示放大的位图:picture1Box1.Image=Zoom_Bitmap_Screen6、最初picture1Box1的大小适合屏幕大小相同的。但现在picture1Box1里的Image大小已经是原来的2倍了,所以将picture1Box1的大小也进行调整,使得其与位图Zoom_Bitmap_Screen大小相同:picture1Box1.Size=Zoom_B
17、itmap_Screen.Size;,图形漫游,思路:由于放大的屏幕图像是放在picture1Box1之中,我们只需改变picture1Box1的Left和Top属性来移动picture1Box1,就可以显示出被遮挡部分。步骤:1、设置空白键状态变量。2、记录鼠标按下的位置。3、在MoeseMove事件中。检查空白键是否按下。并根据鼠标和picture1Box1位置决定移动方向和距离。,图形漫游,空白键状态变量设置:1、在有键按下时:private void frmMain_KeyDown(object sender,KeyEventArgs e)if(e.KeyCode=Keys.Space
18、)/如果是空格键 IsSpacePressed=true;/空格键按下标记为true 2、按键松开,设置空格键按下标记为falseprivate 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、MoeseM
19、ove事件中的相关代码:if(IsSpacePressed)/按下了空格键,为图像漫游/如果新位置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
20、-pictureBox1.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-pictureBox1.Height;else pictureBox1
21、.Top=pictureBox1.Top+(Y-StartY);return;,工具栏的制作,思路:将一个ToolStrip控件放置于一个新窗体之中,窗体的大小和工具栏大小相同。使用一个Timer组件使窗口上移,使用另一个Timer组件使窗口下移在MouseEnter事件中激活使窗口下移的Timer组件。在MouseLeave事件中激活使窗口上移的Timer组件,工具栏的制作,1、Top逐渐减小,即工具栏上移。if语句判断是否Top太小,要保证底端至少12像素高度出现在屏幕上。private void timer1_Tick(object sender,EventArgs e)if(Top 1
22、2-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.Enabled=true;timer1.Enabled=false;4、激活timer1控件,工具栏上移private void t
23、oolStrip1_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,10),new Point(10,10);p.AddRectangle(new Rectangle(AcceptButton,new Size(30,100);2
24、、绘制路径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,100.0f,new Point(10,10),new StringFormat();Region r=new Region(p);2、区域的填充e.Graphics.FillRegion(B
25、rushes.Blue,r);3、区域的剪裁效果this.Region=r;,坐标变换,坐标系类型:1、世界坐标是用于建立特殊图形世界模型的坐标系,也是在.NET Framework 中传递给方法的坐标系。2、页面坐标系是指绘图图面(如窗体或控件)使用的坐标系。3、设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系。,坐标变换,平移变换 myGraphics.TranslateTransform(100,50);myGraphics.DrawLine(myPen,0,0,160,80);,坐标变换,旋转与缩放RotateTransform方用来旋转坐标系声明:public vo
26、id RotateTransform(float angle);参数:angle为要旋转的角度,以度为单位。ScaleTransform方法用来缩放坐标系声明:public void ScaleTransform(float sx,float sy);参数:sx为X方向上缩放因子sy为Y方向缩放因子。,坐标变换,示例:private void Form1_Paint(object sender,PaintEventArgs e)/创建半透明红色画刷 Brush b=new SolidBrush(Color.FromArgb(125,Color.Red);e.Graphics.FillRecta
27、ngle(b,100,50,100,40);/填充矩形 e.Graphics.RotateTransform(30);/坐标系旋转30度 e.Graphics.FillRectangle(b,100,50,100,40);/填充矩形 e.Graphics.ResetTransform();/恢复原是坐标系/设置放大因子,X坐标为原来的0.3倍,Y坐标为原来的2倍 e.Graphics.ScaleTransform(0.3f,2);e.Graphics.FillRectangle(b,100,50,100,40);/填充矩形,色彩变换,对图片实现像素处理1、获取位图指定点颜色public Col
28、or 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/10
29、0,c1.G*trackBar1.Value/100,c1.B*trackBar1.Value/100);b.SetPixel(i,j,c2);/设置像素点新颜色值 pictureBox1.Image=b;/显示新位图,色彩变换,颜色矩阵,(0,255,127,255),=(0,127,101,76),R,G,B,A,相乘,相加,影响红色,影响绿色,影响兰色,影响透明度,色彩变换,颜色矩阵运用1、创建颜色矩阵 float colorMatrixElements=new float 1.0f,0.0f,0.0f,0.0f,0.0f,new float 0.0f,0.5f,0.0f,0.0f,0.
30、0f,new float 0.0f,0.0f,0.8f,0.0f,0.0f,new float 0.0f,0.0f,0.0f,0.3f,0.0f,new float 0.0f,0.2f,0.1f,0.0f,1.0f;ColorMatrix colorMatrix=new ColorMatrix(colorMatrixElements);2、创建ImageAttributes 实例并设置颜色矩阵ImageAttributes 类提供了名为SetColorMatrix的方法,该方法具有多种重载形式,其中一种声明如下:public void SetColorMatrix(ColorMatrix ne
31、wColorMatrix);ImageAttributes imageAttributes=new ImageAttributes();imageAttributes.SetColorMatrix(colorMatrix);,色彩变换,3、使用Graphics 的DrawImage方法绘制图像并指定ImageAttributes 选项。Graphics g=Graphics.FromImage(newImage);/将原图像进行色彩变换并绘制到Graphics对象g上,而绘制的内容实际会保存到newImage中。g.DrawImage(OldImage,new Rectangle(0,0,newImage.Width,newImage.Height),0,0,OldImage.Width,OldImage.Height,raphicsUnit.Pixel,imageAttributes);,