收藏 分享(赏)

大学教程(从零开始)-java图形处理和java-2d.ppt

上传人:无敌 文档编号:406618 上传时间:2018-04-05 格式:PPT 页数:52 大小:439KB
下载 相关 举报
大学教程(从零开始)-java图形处理和java-2d.ppt_第1页
第1页 / 共52页
大学教程(从零开始)-java图形处理和java-2d.ppt_第2页
第2页 / 共52页
大学教程(从零开始)-java图形处理和java-2d.ppt_第3页
第3页 / 共52页
大学教程(从零开始)-java图形处理和java-2d.ppt_第4页
第4页 / 共52页
大学教程(从零开始)-java图形处理和java-2d.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、第7章 Java图形、图像与多媒体,学习导读,Java语言的类库中提供了丰富的绘图方法,其中大部分对图形、文本、图像的操作方法都定义在Graphics类中,Graphics类是java.awt程序包的一部分。本章介绍的内容包括了颜色、字体处理、基本图形绘制方法、文本处理以及Java 2D中Graphics2D提供的基本图形绘制和图形特殊效果处理等方面的内容。,课程结构,7.1 绘图基础7.2 绘图 7.3 图像处理基础 7.4 多媒体基础,7.1 Java图形坐标系统和图形上下文,Java坐标系统Java的坐标原点(0,0)位于屏幕的左上角,坐标度量以象素为单位,水平向右为X轴的正方向,竖直向

2、下为Y轴的正方向,每个坐标点的值表示屏幕上的一个像素点的位置,所有坐标点的值都取整数,如下图所示。,7.1 绘图基础,任何一个图形对象(java.awt.Component的子类)使用java.awt.Grephics类提供的绘图方法就可以画出线条、矩形、圆形等图形。该方法为: public void paint(Graohics g);,7.1.1 Graphics类,图7.1 组件的坐标系统,7.1.2字形和颜色,字符串、字符和字节输出在Graphics类中,Java提供了三个文字输出方法。(1)字符串输出方法:drawString (String string, int x, int y

3、)(2)字符输出方法:drawChars (char chars , int offset, int number, int x, int y)(3)字节输出方法:drawBytes (byte bytes , int offset, int number, int x, int y),7.1.2字形和颜色,Java在Font类中实现对字体的控制,可改变字体、风格和大小。字体的数量和计算机平台密切相关,不同计算机上安装的字体差别很大。Font类的构造方法:Font(String fontName,int style,int size)例如:Font fn=new Font(“宋体”,Font.

4、PLAIN,12);其中:常用的字体有宋体,楷体等; 常用的风格:正常(Font.PLAIN)、粗体(Font.Bold)、斜体(Font.ITALIC),7.1.2字形和颜色,Font类的其他常用方法:getStyle();getSize();getName();isPlain();isBold();isItalic();,7.1.2字形和颜色,Java在Color类中实现对颜色的控制,可改变前景色和背景色。此外,程序员还可以通过调配三原色的比例创建自己的Color对象。Color类有以下几种常用的构造方法:Color(float r,float g,float b) 指定三原色的浮点值,每

5、个参数取值在0.01.0之间。Color(int r,int g,int b) 指定三原色的整数值,每个参数取值在0255之间。Color(int rgb) 指定一个整型数代表三原色的混合值,1623比特位代表红色,815比特位代表绿色,07比特位代表蓝色。,7.1.2字形和颜色,Color常用方法:setColor(Color c);组建类中:setForeground(Color c); setBackground(Color c);getColor();,7.2 绘图,绘制直线 在Java中可以使用下面方法绘制一条直线: drawLine(int x1, int y1, int x2,

6、int y2);/使用当前颜色,在点(x1, y1) 和 (x2, y2) 之间画线。绘制矩形普通直角矩形 drawRect(int x, int y, int width, int height); fillRect(int x, int y, int width, int height); 圆角矩形 drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); fillRoundRect(int x, int y, int width, int height, int arcWidth, i

7、nt arcHeight); 三维矩形 draw3DRect(int x, int y, int width, int height, boolean raised); fill3DRect(int x, int y, int width, int height, boolean raised);,绘制椭圆 drawOval(int x, int y, int width, int height); fillOval(int x, int y, int width, int height);例在框架中绘制直线、矩形和椭圆。,图7-3,绘制弧形 drawArc(intx, inty, intwi

8、dth, intheight, intstartAngle, intarcAngle); fillArc(intx, inty, intwidth, intheight, intstartAngle, intarcAngle);绘制多边形和折线段绘制多边形 drawPolygon(intxPoints, intyPoints, intnPoints); fillPolygon(intxPoints, intyPoints, intnPoints); 绘制折线段 drawPolygonline(intxPoints, intyPoints, intnPoints);,例 在框架中绘制扇形和星形。

9、,图7-4,【例】设置Graphics对象画图,显示结果如图7.1所示。源程序代码如下:/程序文件名SimpleGUI.javaimport java.awt.*;import java.applet.*;public class SimpleGUI extends Appletpublic void init(),public void paint(Graphics g)/g.clipRect(50,50,180,180);/画线g.drawLine(0,0,20,30);/输出字符串g.drawString(图形显示,100,30);/设置颜色Color c = new Color(255

10、,200,0);g.setColor(c);/设置字体,Font f = new Font(TimesRoman,Font.BOLD+ Font.ITALIC,24);g.setFont(f);g.drawString(图形显示,180,30);g.drawLine(20,20,100,50);g.drawLine(20,20,50,100);/矩形g.drawRect(40,40,40,40);g.fillRect(60,60,40,40);g.setColor(Color.red);/3D矩形g.draw3DRect(80,80,40,40,true);,g.draw3DRect(100,

11、100,40,40,false);g.fill3DRect(120,120,40,40,true);/椭圆g.drawOval(150,150,30,40);g.fillOval(170,170,20,20);g.setColor(Color.blue);/圆角矩形g.drawRoundRect(180,180,40,40,20,20);g.fillRoundRect(200,200,40,40,20,20);,/多边形int xC = 242,260,254,297,242;int yC = 240,243,290,300,270;g.drawPolygon(xC,yC,5);,图7.1 简

12、单的图形界面,将例7.1注释的程序语句/ g.clipRect(50,50,180,180);的注释符号去掉,重新编译执行,可以看见如图7.2所示的结果。,图7.2 裁剪后的图形界面,7.2.2 Graphics2D类,Graphics2D类继承于Graphics类,提供几何学、坐标变换、颜色管理以及文本排列等的更高级控制。Graphics2D类是Java平台上渲染二维图形、文字、以及图片的基础类,提供较好的对绘制形状、填充形状、旋转形状、绘制文本、绘制图像以及定义颜色的支持。,在AWT编程接口中,用户通过Paint方法接收Graphics对象作为参数,若是使用Graphics2D类,就需要在

13、Paint方法中进行强制转换。Public void paint(Graphics old)Graphics2D new = (Graphics2D)old;,Graphics2D简介 Graphics2D对象保存了大量用来确定如何绘制图形的信息,其中大部分都包含在一个Graphics2D对象的6个属性之中,这6个属性分别为: (1)绘制(paint) (2)画笔(stroke)(3)字体(font) (4)转换(transform) (5)剪切(clip)(6)合成(composite),Graphics2D的属性设置stroke:stroke用于在绘制图形的轮廓时确定线条的形状和粗细,通常

14、使用BasicStroke对象来定义、通过setStroke()方法设定stroke的属性值。 BasicStroke类提供了下面的构造方法来建立画笔的绘制方式:,BasicStoke ();BasicStoke (float width);BasicStoke (float width, int cap, int join);BasicStoke (float width, int cap, int join, floatmiterlimit);BasicStoke (float width, int cap, int join, floatmiterlimit, floatdash, fl

15、oatdash_phase);,width - 此 BasicStroke 的宽度。此宽度必须大于或等于 0.0f。 如果将宽度设置为 0.0f,则将笔划呈现为可用于目标设备和 抗锯齿提示设置的最细线条。 cap - BasicStroke 端点的装饰 join - 应用在路径线段交汇处的装饰 miterlimit - 斜接处的剪裁限制。miterlimit 必须大于或等于 1.0f。 dash - 表示虚线模式的数组 dash_phase - 开始虚线模式的偏移量,CAP_BUTT 无装饰地结束未封闭的子路径和虚线线段。 CAP_ROUND 使用半径等于画笔宽度一半的圆形装饰 结束未封闭的子

16、路径和虚线线段。 CAP_SQUARE 使用正方形结束未封闭的子路径和虚线线段,正方形越过线段端点,并延长等于线条宽度一半的距离。,Graphics2D的属性设置paint:用来对要绘制的图形或文字的颜色进行设置。 具体设置是通过它的成员方法setPaint()和getPaint()来实现的。例如,假设g2是Graphics2D对象,可以用g2.setPaint(Color.green)语句设置g2的paint属性为绿色。,Graphics2D的属性设置transform:用来时间常用的图形平移、缩放、旋转和斜切等变换操作。先用AffineTransform对象,然后调用setTransfor

17、m()方法设置transform属性。,Graphics2D的属性设置clip:用于实现剪裁效果方法为:setClip(),Graphics2D的属性设置composit:设置图形重叠区域的效果。先用方法AlphaComposite.getInstance(int rule,float alpha) 得到AlphaComposite对象。用setComposite()方法设置效果。,2.Graphics2D的绘图方法保留了Graphics的绘图方法增加新方法,新方法将几何图形作为一个对象来绘制。主要有:Line2DRectangle2DRoundRectangle2DEllipse2DArc2

18、DQuadCurve2DCubicCurve2D,2.Graphics2D的绘图方法举例:Graphics2D g2d=(Graphics2D)g;Line2D line=new Line2D.Double(2,3,200,300);g2d.draw(line);,7.3.1图像载入和输出在Java程序中,不仅可以用画图方法自行绘制图形,还可以显示以文件存储的图像。图像文件有多种格式。Java可以识别的图像文件格式有GIF,JPG,JPEG,PNG等。通过Java程序显示图像,需做以下工作:(1)定义Image类对象,用于存储图像文件。(2)通过getImage()方法把要显示的图像文件存在到

19、Image类对象中。getImage()是Applet类定义的方法,原型为:public Image getImage(URL url,String filename)其中,第一个参数url是图像文件所在的URL地址,第二个参数filename是图像文件名。,7.3图像处理基础,(3)获得图像的高度和宽度的方法,原型为:public int getHeight(ImageObserver obs)public int getWidth(ImageObeserver obs)其中,参数obs是显示图像的容器,可以用this表示当前容器。(4)通过drawImage()方法显示图像。格式如下:pu

20、blic boolean drawImage(Image img,int x,int y,int length,int width,ImageObserver obs)public boolean drawImage(Image img,int x,int y,ImageObserver obs)第一个参数用来存储图像文件。第二、三个参数显示图像的坐标,该坐标是图像左上角显示的位置。第四、五个参数是图像显示的高度和宽度。第六个参数是显示图像的容器。,缓冲技术,缓冲是在内存或显存中开辟一块与屏幕一样大小的存储区域,作为缓冲屏幕。将下一帧要显示的图像绘制到这个缓冲屏幕上面,在显示的时候将虚拟屏幕中

21、的数据复制到可见视频缓存区里面去。 在Java程序中要实现这个技术,首先在缓冲区建立一个绘制图像的Graphics对象,进行paint()的操作,当完成了以后再把它显示到屏幕上,由于从缓冲区读取数据的速度很快,就不会出现闪烁了。,7.3.2图像缓冲技术,显示图像时,当窗口的大小发生改变时,会发现图片不能马上显示或显示滞后,基于这样的考虑,我们可以调用类 java.awt.Component 中的方法createImage(int, int),创建一幅用于 双缓冲的、可在屏幕外绘制的图像。所谓的图像显示的双缓冲技术,首先把图像装入内存,然后再显示在程序窗口中。,缓冲技术优缺点 :,优点:图形绘制

22、过程是在不可见的虚拟屏幕中进行,所以可以消除屏幕的闪烁。缺点:在显示的时候将虚拟屏幕中的数据复制到可见视频缓存区里面去,由于要复制大量的数据,速度可能就会慢一些。,其创建方式如下所示:try img=createImage(800,600); /建立图像对象缓冲区 graphics=img.getGraphics(); /得到绘制图像的graphics对象 catch (NullPointerException e)graphics.drawImage(cropped,0,30,this); /在屏幕外的缓冲区中绘 /制图像g.drawImage(img,0,0,this); /在屏幕上显示图

23、像 ,如何使用缓冲建立图像缓冲区?,主画面的图像直接在屏幕上显示。在绘制连续动画时,首先清除次画面的内容,然后在次画面中绘制图像,等次画面中的图像绘制完成后,再将次画面的全部内容载入主画面进行显示。因为在主画面中不进行清除Applet显示区内容的操作,所以主画面在屏幕上显示时就不会产生闪烁现象。使用缓冲技术时,必须利用creatImage()方法建立图像对象,此外还需要一个Graphics类的对象,用来将下一个要显示的画面绘制到缓冲区中,但是并不是真正地显示到屏幕上。当画面成功地绘制到缓冲区之后,再利用drawimage()方法将当前缓冲区的Image对象绘制到Applet区域中,并且迅速地覆

24、盖前一个画面,在覆盖的过程中并不清除原来画面的背景,所以能够有效地减少闪烁的情况。也就是说把原来影像清除,显示影像的复杂工作由看不见的Image对象来进行,而在Applet上则只是单纯地将画面覆盖而已。,1. 在init()方法内创建一张空白图像作为后台图像: Image BufferImg = creatimage(getSize( ).width , getSize( ).height); Graphics BufferG = BufferImg.getgraphics();2. 把原来paint()方法中的绘图动作都先转移到备用屏幕BufferG上进行操作,相当于在缓冲屏幕上绘图: Bu

25、fferG.drawimage(img , x , y , this);3. 在paint()方法内程序代码的最后,把后台图像一次显示在屏幕上: g.drawimage(BufferImg , x , y , this) ;4. 改写update()方法: public void update((Graphics g) /重载paint()方法 paint(g); ,它的具体实现步骤如下,利用缓冲区技术显示动画效果。在本例中,利用画图工具绘制了一个红色的实心圆,并且利用缓冲区技术使该圆从屏幕的左边循环向右平移。import java.awt.*;import java.applet.*;pub

26、lic class Li10_08 extends Applet implements Runnable int xpos; /保存圆的坐标,因为圆左右平移,所以Y坐标不变 Thread runner; boolean painted=false; Image BufferImage; Graphics BufferGraphics;,public void init() /初始化,建立缓冲区图像对象和缓冲区 BufferImage = createImage(getSize().width, getSize().height); BufferGraphics = BufferImage.ge

27、tGraphics(); public void start() if(runner =null) runner = new Thread(this); /新建一个线程 runner.start(); /启动新线程 public void stop() if (runner != null) runner = null; /回收线程,释放线程所占的资源 ,public void run() while (true) for (xpos=0; xpos 400-90;xpos += 3) repaint(); try Thread. sleep (100); catch (Interrupted

28、Exception e) if (painted) painted = false; public void update (Graphics g) paint(g); /重载paint()方法 ,public void paint (Graphics g) BufferGraphics.setColor(Color.white); BufferGraphics.fillRect(0, 0, getSize().width, getSize().height); BufferGraphics.setColor(Color.red); BufferGraphics.fillOval(xpos,

29、20,90,90); painted=true; g.drawImage(BufferImage, 0,0, this); 通过缓冲区技术可以很好的解决在播放动画时所遇到的一些问题。但是缓冲区技术需要在内存中开辟一块对应于屏幕的内存,多占用了内存资源;在绘制图像时先把图像绘制在次画面再载入主画面,还增加了操作的复杂度。虽然有以上的两个缺点,但是对于现在高性能桌面计算机而言,缓冲区技术对计算机资源占用率是微乎其微的,因此利用缓冲区技术可以很好的解决绘制图像时遇到的闪烁和残影现象。,【综合案例】,使用缓冲技术显示图像。,import java.awt.*; /加载awt包 import java.

30、applet.*; /加载java.applet包public class BackgroundImage extends Applet Image img1; /创建图像对象 boolean imageDisuale = false; /设置布尔变量 public void init() /Java小应用程序的初始化方法 img1=this.getToolkit().getImage(“a.jpg); /获得当前目录下的图像 Image doubleImage = createImage(getSize().width,getSize().height); /创建图像对象 Graphics

31、og = doubleImage.getGraphics(); /获得Graphics类对象 og.drawImage(img1,0,0,this); /绘制图像 public void paint(Graphics g) /Java小应用程序的绘图方法 if(imageDisuale) g.drawImage(img1,0,0,null) ; /绘制图像 showStatus(图像显示); /设置状态栏显示内容 else showStatus(加载图像); public boolean imageUpdate(Image img,int infoflags,int x,int y,int w

32、,int h) if(infoflags=ALLBITS) imageDisuale=true; repaint(); /调用paint()方法 return false; else return true; ,总结,缓冲是在内存或显存中开辟一块与屏幕一样大小的存储区域,作为缓冲屏幕。将下一帧要显示的图像绘制到这个缓冲屏幕上面,在显示的时候将虚拟屏幕中的数据复制到可见视频缓存区里面去。利用缓冲技术的图形绘制过程是在不可见的虚拟屏幕中进行,所以可以消除屏幕的闪烁。在显示的时候将虚拟屏幕中的数据复制到可见视频缓存区里面去,由于要复制大量的数据,速度可能就会慢一些。,7.4多媒体基础7.4.1播放幻

33、灯片和动画7.4.2播放声音 用Java可以编写播放.au,.aiff,.wa, .midi,.rfm格式的音频。au格式是Java早期唯一支持的音频格式。要在Java Applet中播放声音,可以使用Applet的一个静态的方法(类方法): newAudioClip(URL url,String name)或Applet类的实例方法: getAudioClip(Url url,String name),根据参数url提供的地址,以及该处的声音文件name,可以获得一个用于播放的音频对象(AudioClip类型对象)。这个音频对象可以使用下列方法来处理声音文件:play()播放声音文件name。loop()循环播放name。stop()停止播放name。,7.6本章小结,本章介绍了Java中图形和文本的绘制方法,主要包括以下几方面内容: Color类、Font类的使用; 基本的几何图形如:直线、矩形、椭圆、弧形和多边形的绘制; Java 2D API的基本内容; Java 2D 中Graphics2D的基本内容;在Java 2D中如何绘制直线、矩形、椭圆等基本图形。 如何载入图像和图像的缓冲。如何播放声音。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报