《图形图像和多媒体.ppt》由会员分享,可在线阅读,更多相关《图形图像和多媒体.ppt(44页珍藏版)》请在三一办公上搜索。
1、图形、图象与多媒体,本章重点 设置字型 设置颜色 几何图形绘制方法 图像显示技术基础,绘图基础,基本图形包括点、线、圆、矩形等,是构成复杂图形的基础。绘制基本图形要使用AWT中的Graphics类,它提供了各种基本图形的绘制方法,可以直接引用这些方法。确定平面坐标系,坐标原点(0,0)位于整个区域的左上角。一个坐标点对应屏幕上的一个像素,必须是整数。,Graphics类的基本功能,java.awt包中的Graphics提供建立字体、设定颜色、显示图像、文本、绘制和填充各种图形的功能。Graphics2D类继承Graphics提供更多的状态和属性,使应用程序能绘制出更加丰富多彩的图形。要在某个组
2、件中绘图,需要在这个组件所属的类中重写paint()方法,在该方法中绘图。如果要在JComponent子类的组件中绘图,则需重写paintComponent()方法,自型和颜色,绘制文本的方法有三种:在指定的位置绘制字符串drawString(String str,int x,int y)g.drawString(中国Wxyz,10,60);,10,60,字型和颜色,文字字型有三个要素:字体(name)、风格(style)、字号(size)字体:宋体,黑体,Times New Roman等风格:Font.PLAIN(正常),Font.BOLD(粗体),Font.ITALIC(斜体),Font.
3、BOLD+Font.ITALIC字号:整数,单位是磅Java中Font类的对象代表字体 Font font=new Font(“宋体”,Font.PLAIN,12);绘图时使用Graphics对象的setFont方法设置字体,字型和颜色,Java中使用Color类设置颜色,生成颜色的方法有两种。使用预定义的颜色:Color.RED,Color.YELLOW等通过红绿蓝(RGB)的值合成颜色,例如使用3个0-255的整数创建对象 Color c=new Color(255,0,0);绘图时使用Graphics对象的setColor()方法设置颜色,使用Component对象的setBackgro
4、und()方法设置背景色。,绘图模式,绘图模式指绘制的图形与之前绘制的图形有重叠时,重叠部分的颜色如何确定。正常模式:后绘制的图形覆盖原先的图形。setPaintMode()异或模式:将正要绘图的颜色、原先图形的颜色和设定的颜色做特定的运算,得到实际的绘图颜色。setXORMode(),g.setColor(Color.BLUE);g.drawString(dsbdsfsfs,20,50);g.setColor(Color.YELLOW);g.fillRect(10,10,100,50);,g.setColor(Color.BLUE);g.drawString(dsbdsfsfs,20,50)
5、;g.setColor(Color.YELLOW);g.fillRect(10,10,100,50);,XOR绘图模式,setBackground(Color.yellow);/设此颜色为Bg.setXORMode(Color.red);/设此颜色为Cg.setColor(Color.green);/设此颜色为D规则1:用背景色画图出现设置的颜色CB+B=CsetBackground(Color.yellow);g.setXORMode(Color.red);g.setColor(Color.YELLOW);g.fillRect(20,20,80,40);,红色,XOR绘图模式,规则2:一个图
6、形重画时会清除原有图形D+D=BsetBackground(Color.yellow);g.setXORMode(Color.red);g.setColor(Color.BLUE);g.fillRect(20,20,80,40);g.fillRect(20,20,80,40);,清除,XOR绘图模式,规则3:背景色和绘图颜色不一样时,为两者的混合色B+D=B和D的混合色setBackground(Color.yellow);g.setXORMode(Color.red);g.setColor(Color.BLUE);g.fillRect(20,20,80,40);,黄+蓝,XOR绘图模式,规则
7、4:某区已经用D着色,再用E着色D+E=B和E的混合色(B和E不同)setBackground(Color.yellow);g.setXORMode(Color.red);g.setColor(Color.BLUE);g.fillRect(20,20,80,40);g.setColor(Color.GREEN);g.fillRect(20,20,40,40);,黄+蓝+绿,Graphics的绘图方法,画线段drawLine(intx1,inty1,intx2,inty2)普通矩形drawRect(intx,inty,intwidth,intheight)用线框围起来的矩形fillRect(in
8、tx,inty,intwidth,int height)填充矩形圆角矩形drawRoundRect(int x,int y,int width,int height,int arcW,int arcH)用线框围起来的圆角矩形fillRoundRect(int x,int y,int width,int height,int arcW,int arcH)填充圆角矩形 如果后四个参数相等,画出来的是圆形。,Graphics的绘图方法,三维矩形draw3DRect(intx,inty,intwidth,intheight,booleanraised)fill3DRect(intx,inty,intw
9、idth,intheight,booleanraised)raised为true表示突出的,false是凹陷的画椭圆drawOval(int x,int y,int width,int height)fillOval(int x,int y,int width,int height)画以(x,y)为原点,即矩形的左上角,宽为width,高为height的矩形的内切椭圆。,Graphics的绘图方法,画圆弧drawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)fillArc(intx,inty,intwidth,inthei
10、ght,intstartAngle,intarcAngle)得到的弧由 startAngle 开始,并以当前颜色转 arcAngle 度。角度的 0度位于 3点钟位置。正值指示逆时针旋转,负值则指示顺时针旋转。g.drawRect(5,5,100,50);g.drawArc(5,5,100,50,0,360);g.drawRect(5,5,100,50);g.drawArc(5,5,100,50,0,-270);g.drawRect(5,5,100,50);g.drawArc(5,5,100,50,90,90);,Graphics的绘图方法,画多边形drawPolygon(intxPoints
11、,intyPoints,intnPoints)fillPolygon(intxPoints,intyPoints,intnPoints)int px1=50,90,10,50;int py1=10,50,50,10;g.fillPolygon(px1,py1,4);,(50,10),(90,50),(10,50),Graphics的绘图方法,使用Polygon类创建多边形。Polygon p=new Polygon();p.addPoint(50,10);p.addPoint(90,50);p.addPoint(10,50);p.addPoint(50,10);g.fillPolygon(p)
12、;,(50,10),(90,50),(10,50),Graphics的绘图方法,擦除矩形块用背景色填充一个矩形块,相当于擦除矩形块位置的图形clearRect(intx,inty,intwidth,intheight),(50,10),(90,50),(10,50),int px1=50,90,10,50;int py1=10,50,50,10;g.fillPolygon(px1,py1,4);g.clearRect(35,30,15,15);,clipRect,限定作图显示区域,区域内的图形可以显示clipRect(intx,inty,intwidth,intheight),g.setCol
13、or(Color.YELLOW);g.fillRect(10,10,100,100);,g.clipRect(20,20,50,50);g.setColor(Color.YELLOW);g.fillRect(10,10,100,100);,复制图形,copyArea(intx,inty,intwidth,intheight,intdx,intdy)x-源矩形的 x 坐标。y-源矩形的 y 坐标。width-源矩形的宽度。height-源矩形的高度。dx-水平偏移,右为正,左为负dy-垂直偏移,下为正,上为负,g.setColor(Color.YELLOW);g.fillRect(0,0,100
14、,100);g.setColor(Color.red);g.drawRect(30,30,50,50);g.copyArea(30,30,50,50,100,100);,paint,repaint,update方法,paint:应该绘制组件的内容时调用此方法;组件第一次在屏幕上显示,组件的大小改变了,部件显示的内容受损需要维护。(比如,先前挡住组件的其它物体移走了,于是组件被挡住的部分曝露出来)repaint:对于重量级组件(JFrame,JApplet,JDialog和awt组件),先调用update方法,在update方法中实现部分图形的修改,然调用paint方法。对于轻量级(JCompo
15、nent的子孙)组件调用paint方法,Graphics2D类的绘图方法,拥有更强大二维的图形处理能力,提供坐标变换、颜色管理以及文字布局等更精确的控制。public abstract class Graphics2D extends Graphics,Stroke属性,Stroke属性控制线条的宽度,笔形的样式,线段连接方式或短划线图案。该属性的设置需要创建BasicStroke对象,再调用setStroke()方法来设置。,cap样式:,join样式:,public void paint(Graphics g)Graphics2D g2d=(Graphics2D)g;Line2D line
16、=new Line2D.Double(30.0,10.0,180.0,10.0);g2d.draw(line);BasicStroke bs=new BasicStroke(20f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND);g2d.setStroke(bs);Line2D line2=new Line2D.Double(30.0,40.0,180.0,40.0);g2d.draw(line2);bs=new BasicStroke(20f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_ROUND);g2d.set
17、Stroke(bs);Line2D line3=new Line2D.Double(30.0,80.0,180.0,80.0);g2d.draw(line3);bs=new BasicStroke(20f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);g2d.setStroke(bs);Line2D line4=new Line2D.Double(30.0,120.0,180.0,120.0);g2d.draw(line4);,public void paint(Graphics g)bs=new BasicStroke(20f,BasicStro
18、ke.CAP_BUTT,BasicStroke.JOIN_ROUND);g2d.setStroke(bs);int x=30,160,200;int y=160,400,200;g2d.setColor(Color.GREEN);g2d.drawPolygon(x,y,3);,JOIN_ROUND,JOIN_MITER,JOIN_BEVEL,paint属性,paint属性控制填充效果。,BasicStroke bs=new BasicStroke(5.5f);g2d.setStroke(bs);GradientPaint gp=new GradientPaint(30.0f,30.0f,Col
19、or.RED,180.0f,30.0f,Color.GREEN);g2d.setPaint(gp);Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.draw(line);,transform属性,Transform属性用来实现常用图形的平移、缩放、旋转和斜切变换等操作。旋转变换,AffineTransform rotate=AffineTransform.getRotateInstance(Math.PI/2,30.0,30.0);g2d.setTransform(rotate);Line2D line=new Line2D.Do
20、uble(30.0,30.0,180.0,30.0);g2d.draw(line);,AffineTransform rotate=new AffineTransform();rotate.rotate(Math.PI/2,30.0,150.0);g2d.setTransform(rotate);Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.draw(line);,transform属性,缩放,AffineTransform scale=AffineTransform.getScaleInstance(2,2);g2d.setT
21、ransform(scale);Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.draw(line);,transform属性,平移,AffineTransform transform=AffineTransform.getTranslateInstance(10,50);g2d.setTransform(transform);Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.draw(line);,transform属性,斜切,AffineTransform shea
22、r=AffineTransform.getShearInstance(5,2);g2d.setTransform(shear);Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.draw(line);,clipe属性,clipe属性用于实现剪裁的效果,区域内可见Line2D line=new Line2D.Double(30.0,30.0,180.0,30.0);g2d.setClip(30,30,160,30);g2d.draw(line);,Composit属性,Composit设置图形重叠区的效果AlphaComposite
23、a=AlphaComposite.getInstance(int rule,float alpha);Alpha为0表示透明,1.0表示不透明,Graphics2D的绘图方法,Graphics2D类保留了Graphics类的绘图方法,同时增加了一些新方法。新方法把几何形状作为对象来绘制,在包中声明的一系列类,分别用于创建各种几何图形。public void paint(Graphics g)/将参数g强制类型转换成Graphics2D类型 Graphics2D g2d=(Graphics2D)g;/使用图形类的静态Double方法创建几何图形对象 Line2D line=new Line2D.
24、Double(30.0,30.0,180.0,30.0);/以图形对象为参数,调用Graphics2D对象的draw方法绘制图形 g2d.draw(line);,Graphics2D的几何图形类,线段起点(30,30),终点(180,30)Line2D line=new Line2D.Double(30,30,180,30);g2d.draw(line);,public abstract class Line2D implements Shape,Cloneable public static class Double extends Line2D public Double(double X
25、1,double Y1,double X2,double Y2).,Graphics2D的几何图形类,矩形左上角点坐标(20,20),宽100,高50Rectangle2D rect=new Rectangle2D.Double(20,20,100,50);g2d.draw(rect);g2d.fill(rect);,Graphics2D的几何图形类,圆角矩形左上角点坐标(20,20),宽100,高50,圆角横向直径20,纵向直径40RoundRectangle2D roundRect=new RoundRectangle2D.Double(20,20,100,50,20,40);g2d.dr
26、aw(roundRect);,Graphics2D的几何图形类,椭圆左上角点(20,30),宽100,高50矩形的内切椭圆 Ellipse2D ellipse=new Ellipse2D.Double(20,30,100,50);g2d.draw(ellipse);,Graphics2D的几何图形类,圆弧左上角坐标(20,30),宽100,高50矩形的内切圆弧,90度开始,逆时针转90度Arc2D arc=new Arc2D.Double(20,30,100,50,90,90,Arc2D.OPEN);g2d.draw(arc);Arc2D arc2=new Arc2D.Double(20,30
27、,100,50,0,-90,Arc2D.CHORD);g2d.draw(arc2);Arc2D arc3=new Arc2D.Double(20,30,100,50,0,90,Arc2D.PIE);g2d.draw(arc3);,二次曲线,一条二次曲线需要三个点确定:始点、控制点和终点起点(20,10),控制点(90,65),终点(55,115)QuadCurve2D qc=new QuadCurve2D.Double(20,10,90,65,55,115);QuadCurve2D qc2=new QuadCurve2D.Double(20,10,15,63,55,115);QuadCurve
28、2D qc3=new QuadCurve2D.Double(20,10,54,64,55,115);g2d.draw(qc);g2d.draw(qc2);g2d.draw(qc3);,三次曲线,一条三次曲线需要四个点确定:始点、两个控制点和终点起点(12,30),控制点(50,75),(15,15),终点(115,93)CubicCurve2D c1=new CubicCurve2D.Double(12,30,50,75,15,15,115,93);CubicCurve2D c2=new CubicCurve2D.Double(12,30,15,70,20,25,35,94);CubicCur
29、ve2D c3=new CubicCurve2D.Double(12,30,50,75,20,95,95,95);g2d.draw(c1);g2d.draw(c2);g2d.draw(c3);,图像处理基础,图像是由一组像素构成,用二进制形式保存的图片。Java语言支持GIF,JPEG,BMP这三种图像文件格式。Java语言的图像处理功能被封装在Image中。,图像的载入和绘制,public class ImageDemo extends Appletpublic void paint(Graphics g)/图像位置为Applet所在文件夹下的pic子文件夹下的gugu3.gifImage
30、image=getImage(getCodeBase(),picgugu3.gif);/在当前窗口坐标(10,10)的位置绘制图像 g.drawImage(image,10,10,this);,图像的载入和绘制,public class ImageDemo extends Appletpublic void paint(Graphics g)URL url=null;try url=new URL(this.getCodeBase(),picgugu3.gif);catch(MalformedURLException e)e.printStackTrace();Image image=getImage(url);g.drawImage(image,10,10,this);,图像缓冲,把图像装入内存,在缓冲区中绘制图像或图形,然后将缓冲区中绘制好的图像一次性输出到屏幕上。,