JAVA 图形图像与多媒体详解.docx
- 文档编号:5195684
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:30
- 大小:410.46KB
JAVA 图形图像与多媒体详解.docx
《JAVA 图形图像与多媒体详解.docx》由会员分享,可在线阅读,更多相关《JAVA 图形图像与多媒体详解.docx(30页珍藏版)》请在冰豆网上搜索。
JAVA图形图像与多媒体详解
第7章图形、图像与多媒体
7.1绘图基础
要在平面上显示文字和绘图,首先要确定一个平面坐标系。
Java语言约定,显示屏上一个长方形区域为程序绘图区域,坐标原点(0,0)位于整个区域的左上角。
一个坐标点(x,y)对应屏幕窗口中的一个像素,必须是整数。
如图7.1所示。
窗口大小由超文本文件中的width和height指定。
例如,以下超文本确定窗口宽为250像素,高位400像素:
7.1.1Graphics类的基本功能
在java.awt包中,类Graphics提供的功能有:
建立字体、设定显示颜色、显示图像和文本,绘制和填充各种几何图形。
可以从图形对象或使用Component的getGraphics()方法得到Graphics对象。
Graphics2D类继承Graphics类,并且增加了许多状态属性,使应用程序可以绘制出更加丰富多彩的图形。
在某个组件中绘图,一般应该为这个组件所需的子类重写paint(0方法,在该重写的方法中进行绘图。
但要在JComponent子类的组件中绘图,应重写paintComponent()方法,在该方法中进行绘图。
例如,继承定义一个文本区子类,要在这样的文本区对象中绘图,就应给这个文本区子类重写paintComponent()方法。
系统自动为程序通过图形对象,并以参数g传递给paint()方法和paintComponent()方法。
7.1.2字型和颜色
显示文字的方法主要有三种:
(1)drawString(Stringstr,intx,inty),在指定的位置显示字符串。
(2)drawChar(chardate[],intoffset,intlength,intx,inty),在指定的位置显示字符数组中的文字,从字符数组的offset开始,最多显示length个字符。
(3)drawBytes(chardate[],intoffset,intlength,intx,inty),在指定的位置显示字节数组中的文字,从字节数组的offset开始,最多显示length个字符。
这里给出的显示位置(x,y)为文字的基线的开始坐标,不是文字显示的矩形区域的左上角坐标。
文字字型有三个要素:
字体、风格和字号。
常用的字体有TimesNewRoman、Symbol、宋体、楷体等。
常用的风格有三种:
正常、粗体和斜体,分别用三个常量表示:
Font.PLAIN(正常)、Font.BOLD(粗体)和Font.ITALIC(斜体)。
风格可以组合使用,例如,Font.BOLD+Font.ITALIC。
字号是字的大小,单位是磅。
在Java语言中,用类Font对象设置字型。
Font类的构造方法有:
Font(StringfontName,intstyle,intsize),3个参数分别表示字体、风格和字号。
例如,代码:
FontfnA=newFont(“细明体”,Font.PLAIN,12)
设置的字型是:
细明体、正常风格,12磅字号。
Font类的其他常用方法:
(1)getStyle(),返回字体风格。
(2)getSize(),返回字体大小。
(3)getName(),返回字体名称。
(4)isPlain(),测试字体是否是正常字体。
(5)isBold(),测试字体是否是粗体。
(6)isItalic(),测试字体是否是斜体。
使用Graphics的方法setFont(Fontfont)设置字型。
【例7.1】小应用程序用6种字型显示字符串,显示内容说明本身的字型。
importjava.applet.*;importjava.awt.*;
publicclassExample7_1extendsApplet{
Fontf1=newFont("Helvetica",Font.PLAIN,18);
Fontf2=newFont("Helvetica",Font.BOLD,10);
Fontf3=newFont("Helvetica",Font.ITALIC,12);
Fontf4=newFont("Helvetica",Font.ITALIC,12);
Fontf5=newFont("Courier",Font.BOLD+Font.ITALIC,14);
Fontf6=newFont("Dialog",Font.ITALIC,14);
publicvoidpaint(Graphicsg){
g.setFont(f1);g.drawString("18ptplainHelvetica",5,20);
g.setFont(f2);g.drawString("10ptboldHelvetica",5,43);
g.setFont(f3);g.drawString("12ptitalicHelvetica",5,58);
g.setFont(f4);g.drawString("12ptplainCourier",5,75);
g.setFont(f5);g.drawString("14ptbold&italicTimesRoman",5,92);
g.setFont(f6);g.drawString("14ptitalicDialog",5,111);
}
}
用类Color的对象设置颜色,有两种方法生成各种颜色。
一是用类Color预定义的颜色:
black、red、white、yellow……;二是通过红绿蓝(RGB)的值合成颜色。
与颜色有关的常用方法:
(1)用类Color的构造方法Color(intR,intG,intB)创建一个颜色对象,参数R、G、B分别表示红色、绿色和蓝色,它们的取值是从0到255。
(2)用类Graphics的方法setColor(Colorc),参数c的取值参见表7-1。
(3)用类Component的方法setBackground(Colorc)设置背景颜色。
因为小程序是组件的子类,直接可用setBackground()方法改变背景色。
(4)用类Graphics的方法getColor()获取颜色。
表7-1Color类预定义颜色常量
black
blue
cyan
darkGray
gray
green
lighGray
magenta
orange
pink
red
while
yellow
【例7.2】小应用程序设置颜色并涂方块,其中绘制方块的方法参见7.2节。
importjava.applet.*;
importjava.awt.*;
publicclassExample7_2extendsApplet{
publicvoidpaint(Graphicsg){
setSize(380,200);
for(inti=0;i<=10;i++){
Colormyredcolor=newColor(i*25+5,0,0);
g.setColor(myredcolor);
g.fillRect(i*32+5,2,28,28);//用指定的颜色填充方块
}
for(inti=0;i<=10;i++){
Colormygreencolor=newColor(0,i*25+5,0);
g.setColor(mygreencolor);
g.fillRect(i*32+5,32,28,28);//用指定的颜色填充方块
}
for(inti=0;i<=10;i++){
Colormybluecolor=newColor(0,0,i*25+5);
g.setColor(mybluecolor);
g.fillRect(i*32+5,62,28,28);//用指定的颜色填充方块
}
}
}
7.1.3绘图描述
绘图模式是指后绘制的图形与早先绘制的图形有重叠时,然后确定重叠部分的颜色。
例如,后绘制的覆盖早先绘制的;或者后绘制与早先绘制的两种颜色按某种规则混合。
主要有正常模式和异或模式两种:
●正常模式:
是指后绘制的图形覆盖绘制在早先绘制的图形之上,使早先绘制的图形的重叠部分不可再见。
●异或模式:
是指把绘图看作是按图形着色。
异或模式绘图时,将当前正要绘图的颜色、原先绘制的颜色以及异或模式设定的颜色作特定的运算,得到实际绘图颜色。
设置绘图模式的方法有:
(1)setPaintMode(),设置绘图模式为覆盖模式(正常模式)。
正常模式是绘图的默认模式。
(2)setXORMode(Color),设置绘图模式为异或模式,参数c为异或模式设定的绘图颜色。
设背景色为B,用setXORMode()设置的颜色为C,另用某个背景色D绘图,XOR模式有以下确定实际绘图颜色的法则:
B+B=C,用背景色绘图,出现C颜色。
D+D=B,当一个图形重画时就能清除原先所画的图形。
B+D=B和D的混合色(当B,D不相同时)。
如果某区域已用D着色,再用E着色,则结果是:
D+E=D和E的混合色(当D、E不相同时)。
XOR绘图模式实例参见7.2.1节的例7.4。
7.2绘图
Graphics类提供基本绘图方式,Graphics类提供更强大的绘图能力。
7.2.1Graphics类的绘图方法
Graphics类提供基本的几何图形绘制方法,主要有:
画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等。
(1)画线段
在窗口中画一条线段,可以使用Graphics类的drawLine()方法:
●drawLine(intx1,inty1,intx2,inty2)
例如,以下代码在点(3,3)与点(50,50)之间画线段,在点(100,100)处画一个点。
g.drawLine(3,3,50,50);画一条线段
g.drawLine(100,100,100,100);画一个点
(2)画矩形
有两种矩形:
普通型和圆角型。
画普通矩形有两种方法:
●drawRect(intx,inty,intwidth,intheight)
画线框围起来的矩形。
其中参数x和y指定矩形左上角的位置,参数width和height是矩形的宽和高。
●fillRect(intx,inty,intwidth,intheight)
用预定的颜色填充一个矩形,得到一个着色的矩形块。
以下代码是画矩形的例子:
g.drawRect(80,100,40,25);//画线框
g.setColor(Color.yelloe);
g.fillRect(20,20,20,30);//画着色块
画圆角矩形也有两个方法:
●drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)
是用线围起来的圆角矩形。
其中参数x和y指定矩形左上角的位置;参数width和height是矩形的宽和高;arcWidth和arcHeight分别是圆角弧的横向直径和圆角弧的纵向直径。
●fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)
是用预定的颜色填充的圆角矩形。
各参数的意义同前一个方法。
以下代码是画矩形的例子:
g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形
g.setColor(Color.blue);
g.fillRoundRect(80,100,100,100,60,40);//涂一个画角矩形块
g.drawRoundRect(10,150,40,40,40,40);//画圆
g.setColor(Color.red);
g.fillRoundRect(80,100,100,100,100,100);//涂画块
可以用画圆角矩形方法画圆形,当矩形的宽和高相等,圆角弧的横向直径和圆角弧的纵向直径也相等,并等于矩形的宽和高时,画的就是圆形。
参见上述例子中的注释,前一个是画圆,后一个是涂圆块。
(3)画三维矩形
画三维矩形有两个方法:
●draw3DRect(intx,inty,intwidth,intheight,booleanraised)
画一个突出显示的矩形。
其中参数x和y指定矩形左上角的位置,参数width和height是矩形的宽和高,参数raised是突出与否。
●fill3DRect(intx,inty,intwidth,intheight,booleanraised)
用预订的颜色填充一个突出显示的矩形。
以下代码是画突出矩形的例子:
g.draw3DRect(80,100,40,25,true);//画一个线框
g.setColor(Color.yelloe);
g.fill3DRect(20,70,20,30,ture);//画一个着色块
(4)画椭圆形
椭圆形由椭圆的横轴和纵轴确定。
画椭圆形有两个方法:
●drawOval(intx,inty,intwidth,intheight)
是画用线围成的椭圆形。
其中参数x和y指定椭圆形左上角位置,参数width和height是横轴和纵轴。
●fillOval(intx,inty,intwidth,intheight)
是用预订的颜色填充椭圆形,是一个着色块。
也可以用画椭圆形方法画圆形,当横轴和纵轴相等时,所画的椭圆形即为圆形。
以下代码是画椭圆形的例子。
g.drawOval(10,10,60,120);//画椭圆
g.setColor(Color.cyan);
g.fillOval(100,30,60,60);//涂圆块
g.setColor(Color.magenta);
g.fillOval(15,140,100,50);//涂椭圆
(5)画圆弧
画圆弧有两个方法:
●drawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)
画椭圆的一部分的圆弧线。
椭圆的中心是它的外接矩形的中心,其中参数是外接矩形的左上角坐标(x,y),宽是width,高是height。
参数startAngle和arcAngle的单位是“度”。
起始角度0度是指3点钟方位。
参数startAngle和arcAngle表示从startAngle角度开始,逆时针方向画arcAngle度的弧。
约定,正值度数是逆时针方向,负值度数是顺时针方向,例如-90度是6点钟方位。
●fillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)
用setColor()方法设定的颜色,画着色椭圆的一部分。
以下代码是画圆弧的例子:
g.drawArc(10,40,90,50,0,180);//画圆弧线
g.drawArc(100,40,90,50,180,180);//画圆弧线
g.setColor(Color.yelloe);
g.fillArc(10,100,40,40,0,-270);//填充缺左上角的四分之三椭圆
g.setColor(Color.magenta);
g.fillArc(60,110,110,60,-90,270);//填充缺左下角的四分之三椭圆
g.setColor(Color.blue);
g.fillArc(130,20,40,40,0,360);//填充圆
(6)画多边形
多边形是用多条线段首尾连接而成的封闭平面图。
多边形线段端点的x坐标和y坐标分别存储在两个数组中,画多边形就是按给定的坐标点顺序用直线段将它们连起来。
以下是画多边形常用的两个方法:
●drawPolygon(intxPoints[],inty,intyPoints[],intnPoints)
画一个多边形。
●fillPolygon(intxPoints[],inty,intyPoints[],intnPoints)
用方法setColor()设定的颜色着色多边形。
其中数组xPoints[]存储x坐标点,yPoints[]存储y坐标点,nPoints是坐标点个数。
注意,上述方法并不自动闭合多边形,要画一个闭合的多边形,给出的坐标点的最后一点必须要与第一点相同。
以下代码实现填充一个三角形和画一个八边形。
intpx1[]={50,90,10,50};//首末点相重,才能画出多边形
intpy1[]={10,50,50,10};
intpx2[]={140,180,170,180,140,100,110,100,140};
intpy2[]={5,25,35,45,65,45,35,25,5};
g.setColor(Color.blue);
g.fillPolygon(px1,py1,4);
g.setColor(Color.red);
g.drawPolygon(px2,py2,9);
也可以用多边形对象画多边形。
用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。
Polygon类的主要方法:
1Polygon(),创建多边形对象,暂时没有坐标点。
2Polygon(intxPoints[],inty,intyPoints[],intnPoints[]),用指定的坐标点创建多边形对象。
3addPoint(),将一个坐标点加入到Polygon对象中。
4drawPolygon(Polygonp),绘制多边形。
5fillPolygon(Polygonp),用指定颜色填充多边形。
例如,以下代码,画一个三角形和填充一个黄色的三角形。
注意,用多边形对象画封闭多边形不要求首末点重合。
intx[]={140,180,170,180,140,100,110,100};
inty[]={5,25,35,45,65,45,35,25};
Polygonpolygon1=newPolygon();
polygon1.addPoint(50,10);polygon1.addPoint(90,50);
polygon1.addPoint(10,50);g.drawPolygon(polygon1);
g.setColor(Color.yellow);
Polygonpolygon2=newPolygon(x,y,8);
g.fillPolygon(polygon2);
(7)擦除矩形块
当需要在一个着色图形的中间有一个空缺的矩形块的情况,可用背景色填充一个矩形块实现,相当于在该矩形块上使用了“橡皮擦”。
实现的方法是:
●clearRect(intx,inty,intwidth,intheight)
擦除一个由参数指定的矩形块的着色。
例如,以下代码实现在一个圆中擦除一个矩形块的着色:
g.setColor(Color.blue);
g.setOval(50,50,100,100);
g.clearRect(70,70,40,55);
(8)限定作图显示区域
用一个矩形表示图形的显示区域,要求图形在指定的范围内有效,不重新计算新的坐标值,自动实现超出部分不显示。
方法是:
●clipRect(intx,inty,intwidth,intheight)
限制图形在指定区域内的显示,超出区域的图形不显示。
多个限制区域有覆盖时,得到限制区域的交集区域。
例如,代码:
g.clipRect(0,0,100,50);
g.clipRect(50,25,100,50);
相当于
g.clipRect(50,25,20,25);
(9)复制图形
利用Graphics类的方法copyArea()可以实现图形的复制,其使用格式是:
●copyArea(intx,inty,intwidth,intheight,intdx,intdy)
dx和dy分别表示将图黏贴到原位置偏移的像素点数,正值为往右或往下偏移量,负值为往左或往上偏移量。
位移的参考点是要复制矩形的左上角坐标。
例如,以下代码示意图形的复制,将一个矩形的一部分、另一个图形的全部分别复制。
g.clipRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,,70,,-20,,80);
g.copyArea(110,50,60,,60,,10,,80);
【例7.3】小应用程序重写update()方法,只清除圆块,不清除文字。
窗口显示一个不断移动的红色方块。
importjava.applet.*;importjava.awt.*;
publicclassExample7_3extendsApplet{
inti=1;
publicvoidinit(){
setBackground(Color.yellow);
}
publicvoidpaint(Graphicsg){
i=i+8;if(i>160)i=1;
g.setColor(Color.red);
g.fillRect(i,10,20,20);
g.drawString("我正在学习update()方法!
",100,100);
try{
Thread.sleep(100);//程序暂停0.1秒
}
catch(InterruptedExceptione){}
repaint();
}
publicvoidupdate(Graphicsg){
g.clearRect(i,10,200,100);//不清除“我正在学习update()方法!
”
paint(g);
}
}
一般的绘图程序要继承JFrame,定义一个JFrame窗口子类,还要继承JPanel,定义一个JPanel子类。
在JPanel子类中重定义方法paintcomponent(),在这个方法中调用绘图方法,绘制各种图形。
【例7.4】使用XOR绘图模式的应用程序,绘图效果参见图7.2。
importjava.awt.*;importjavax.swing.*;
publicclassExample7_4extendsJFrame{
publicstaticvoidmain(Stringargs[]){
GraphicsDemomyGraphicsFrame=newGraphicsDemo();
}
}
classShapesPanelextendsJPanel{
ShapesPanel(){
setBackground(Color.white);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 图形图像与多媒体详解 图形图像 多媒体 详解