《java06(第6章java图形与图像处理).ppt》由会员分享,可在线阅读,更多相关《java06(第6章java图形与图像处理).ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java语言程序设计清华大学出版社第第6 6章章 javajava图形与图像图形与图像处理处理本章内容提要本章内容提要1、图形与图像描绘、图形与图像描绘2、数字图像处理、数字图像处理3、java 3D基础基础6.16.1图形与图形的描绘图形与图形的描绘 任何一个图形对象(的子类)使用类提供任何一个图形对象(的子类)使用类提供的绘图方法就可以画出线条、矩形、圆的绘图方法就可以画出线条、矩形、圆形等图形。该方法为:形等图形。该方法为:public void paint(Graohics g);6.1.1 Graphics类类【例例6-1】绘制直线、矩形和圆的简单图绘制直线、矩形和圆的简单图形。形。
2、图6.1 组件的坐标系统 Graphics类常用的绘图方法类常用的绘图方法 方方 法法说说 明明drawLine(drawLine(int x1,int y1,int x2,int y2)绘制一条从绘制一条从(x1,y1)(x1,y1)到到(x2,y2)(x2,y2)的直线的直线drawRect(drawRect(int x,int y,int w,int h)绘制一个顶点为绘制一个顶点为(x,y)(x,y),宽为,宽为w w,高为,高为h h的矩形的矩形drawOval(drawOval(int x,int y,int w,int h)绘制一个在顶点为绘制一个在顶点为(x,y)(x,y),宽
3、为,宽为w w,高,高为为h h的矩形内接椭圆的矩形内接椭圆drawArc(int x,int y,int w,int h,int s1,int s2)绘制一段弧度为从绘制一段弧度为从s1到到s1+s2的圆弧的圆弧clearRect(int x1,int y1,int x2,int y2)用当前颜色填充的方法清除指定矩形用当前颜色填充的方法清除指定矩形区。区。drawString(String s,int x,int y)drawString(String s,int x,int y)在在(x,y)(x,y)处显示字符串处显示字符串s sdrawImage(Image image,int x,
4、int y,ImageObserver observer)在在(x,y)(x,y)处显示处显示图像图像image,observer为加载图像时的图像观察器为加载图像时的图像观察器drawImage(Image image,int x,int y,int w,int h,ImageObserver observer)在在w w宽宽h h高的矩形区域内显示图像,图高的矩形区域内显示图像,图像能自动调整大小比例。像能自动调整大小比例。图像的加载和显示是异步进行的,图像的生产者(ImageProducer)传递给图像的消费者(ImageConsumer)一个与图像相关的位,因为图像的生产过程是一个异步
5、行为,所以 AWT 也提供一个图像观察图像观察(ImageObserver),用来监视图像生产者的图像生产过程。因为 实现 ImageObserver 接口,所以 AWT 中每个构件都是ImageObserver,当一个给定的 ImageProducer 采取异步操作时,这个 ImageObserver 可以选择是否被更新 Graphics类的类的Set/get方法方法 getColor()获得当前图形的色彩setColor(Color c)设置当前图形的色彩getFont()获得当前字体setFont(Font font)设置当前字体getClip()获取当前的剪贴板内容。setClip(i
6、nt,int,int,int)将指定的矩形设置为当前的剪贴区。【例例6-2】绘制用色彩填充的笑脸绘制用色彩填充的笑脸图形。图形。6.1.2 Java 2D 绘制时,只要将绘制时,只要将Graphics 对象强制转化为对象强制转化为Graphics 2D对象就行。对象就行。graphics类还有一些不足,例如缺少改变线条粗细的方法,也类还有一些不足,例如缺少改变线条粗细的方法,也缺少填充一个对象的方法。缺少填充一个对象的方法。Graphics 2D可以解决这些问题。可以解决这些问题。【例【例6-3】设置线条粗细】设置线条粗细线段端点修饰风格简介常 量 名 称常 量 值修 饰 办 法BasicSt
7、roke.CAP_BUTT0对线段端点不加任何修饰BasicStroke.CAP_ROUND1在线段端点加半圆进行修饰,半圆的直径为线段的宽度BasicStroke.CAP_SQUARE2在线段端点加矩形进行修饰,矩形的宽度为线段宽度的一半,矩形的高度为线段的宽度线段折点修饰风格简介常 量 名 称常 量 值修 饰 办 法BasicStroke.JOIN_MITER0对线段折点不加任何修饰BasicStroke.JOIN_ROUND1在折线段的两端加半圆进行修饰,半圆的直径为线段的宽度BasicStroke.JOIN_BEVEL2将组成折点的两条线段的外侧延长至相交,然后填充被包的区域【例【例6
8、-4】填充图形】填充图形GradientPaint类构造函数GradientPaint(float x1,float y1,Color color1,float x2,float y2,Color color2,boolean cyclic)即从点(x1,y1)到点(x2,y2)进行渐变 Cyclic为true时,为循环模式。6.1.3 画布画布Canvas 画布画布Canvas类是一个用来绘制图类是一个用来绘制图形的矩形组件,在画布中可以象在形的矩形组件,在画布中可以象在Applet中那样绘制各种图形,也可中那样绘制各种图形,也可以响应鼠标和键盘事件。以响应鼠标和键盘事件。1、创建Canva
9、s的构造方法没参数,所以使用的构造方法没参数,所以使用简单的语句就可以创建一个画布对象:简单的语句就可以创建一个画布对象:Canvas canvas1=new Canvas();在创建了在创建了 Canvas对象后,一定要调用对象后,一定要调用setSize()方法确定这个画布的大小。方法确定这个画布的大小。Canvas具有自己的坐标系统,使用布具有自己的坐标系统,使用布局管理器可以确定它在其他组件中的位局管理器可以确定它在其他组件中的位置,并且可以用布局管理器来进行版面置,并且可以用布局管理器来进行版面布局。布局。2、常用方法、常用方法 我们在进行程序设计时,经常把要实现我们在进行程序设计时
10、,经常把要实现的功能单独设计为一个类,而把显示这个功的功能单独设计为一个类,而把显示这个功能设计成另一个,我们把实现功能的类称为能设计成另一个,我们把实现功能的类称为业务逻辑层,而显示功能的类称为表现层。业务逻辑层,而显示功能的类称为表现层。这样,把逻辑层和表现层分开,有利于实现这样,把逻辑层和表现层分开,有利于实现代码重用。看下面的示例。代码重用。看下面的示例。【例例6-5】通过一个窗体的文本框输入圆的半通过一个窗体的文本框输入圆的半径及坐标位置,在画布上绘制一个圆。以此径及坐标位置,在画布上绘制一个圆。以此例说明,逻辑层和表现层间的数据传递。例说明,逻辑层和表现层间的数据传递。(b)在画布
11、上绘制圆形图图6.6 逻辑层与表现层的设计模式示例逻辑层与表现层的设计模式示例 (a)逻辑层和表现层间的数据传递6.2 数字图像处理数字图像处理 数字图像处理技术就是将图像信号转数字图像处理技术就是将图像信号转换成数字格式并利用计算机进行处理的换成数字格式并利用计算机进行处理的过程。过程。我们要用到我们要用到awt的的Image类和包,类和包,awt的抽象类的抽象类Image所有图形图像类的父类,所有图形图像类的父类,包为创建和修改图像提供了技术支持。包为创建和修改图像提供了技术支持。6.2.1 图像文件图像文件 例:(1)单一灰色(2)渐变灰度。6.2.2 图像的基本操作图像的基本操作 图像
12、最基本的操作有三种,它们是创建图像、加载图像和显示图像。1、创建图像对象 由于图像最终要在屏幕中显示出来,java.awt的Component类提供了一个createImage()方法来生成Image图像对象。CreateImage()方法有两种形式:Image createImage(ImageProducer imgProd);Image createImage(int width,int height);2、加载图像 获得图像的另一种方法是加载图像。这通过使用由Applet类定义的getImage()方法来实现。它有以下形式:Image getImage(URL url)Image ge
13、tImage(URL url,String imageName)3、显示图像 显示图像可以用drawImage()方法,drawImage()是Graphics类的方法。它有好几种形式,我们将要用到下面的一种:boolean drawImage(Image imgObj,int left,int top,ImageObserver imgOb);【例例6-8】用用getImage()方法和方法和drawImage()方法加载和显示图像。方法加载和显示图像。6.2.3 双双 缓缓 冲冲 由于加载图像需要时间,这时我们就会感觉屏幕在不断闪烁。为了解决这个问题,在内存或显存中开辟一块缓冲区,把加载的
14、图像放到缓冲区中。当图像加载完毕,我们再把图像从缓冲区中调到屏幕上让它显示,由于从缓冲区读取数据的速度很快就不会出现闪烁了。这就称为双缓冲。【例例6-9】演示双缓冲技术的效果。演示双缓冲技术的效果。我们创建了一个Image对象,然后在这个Image对象上(而不是在屏幕上)画图。画图需要用一个Graphics对象。这个Graphics对象可以通过getGraphics()方法来获得。下面构造一个Graphics对象gc,并用红色填充图像。Canvas c=new Canvas();Image test=c.createImage(200,100);Graphics gc=test.getGrap
15、hics();gc.setColor(Color.red);gc.fillRect(0,0,200,100);这个图像是不可见的,仅仅存在于内存中。为了真正显示这个图像,需调用drawImage()方法。6.2.4 图像处理技术图像处理技术 1、像素点数组的构成像素点是一个具有Alpha(透明度)、Red(红)、Green(绿)和Blue(蓝)四个分量表示的整数,记作0 xAARRGGBB。其中A、R、G、B的取值从0f(十六进制)。红色:0 xffff0000 绿色:0 xff00ff00 蓝色:0 xff0000ff 白色:0 xffffffff 黑色:0 xff000000 图像的像素点
16、其排列如图6.14所示,我们按从左往右、从上往下的顺序取出像素点,构成一整型数组。图图6.14像素数组元素的排列像素数组元素的排列2、MediaTracker类类MediaTracker类用于加载多媒体图像,使用时,先生成一个MediaTracker对象,再用它的addImage()方法来加载图像。addImage()方法有以下一般形式:void addImage(Image imgObj,int imgID)void addImage(Image imgObj,int imgID,int width,int height)3、ImageProducer接口和接口和MemoryImageSou
17、rce 类类 ImagePruducer是一个用于生成图像数据对象的接口。实现该接口的对象要用整数型数组或字节型数组生成Image对象。MemoryImageSource是用于生成新的图像的类。它的构造函数如下:MemoryImageSource(int width,int height,int pixel,int offset,int scanLineWidth)4、PixelGrabber类类PixelGrabber类的作用是从现有的图像中提取像素数据构造一个像素数组。在使用PixelGrabber时,首先需要生成一个足够大的int型的数组来存储像素数据,然后生成一个PixelGrabbe
18、r实例对象,将提取到的图像数据存入到一个矩形区域中。最后,这个实例对象中调用grabPixels()方法将数据值放进像素数组中。【例例6-11】将图像进行反相处理示例。将图像进行反相处理示例。6.3.1 Java 3D概述概述Java 3D的安装和运行:到其官方网站:下载最新的系统安装程序。Java 3D安装完毕后,在JDK目录下的jrelibext子目录下,应有四个.jar文件:j3daudio.jar、j3dcore.jar、j3dutils.jar、vecmath.jar,在JDK目录下的jrebin子目录下,应有J3D.dll、j3daudio.dll、J3DUtils.dll文件。另
19、外,在demo目录下的java3d中有系统提供的示例程序。6.3.2 Java 3D程序设计程序设计 1、Java 3D的基本体系结构2、几个基本概念、几个基本概念(1)虚拟空间在Java3D中,虚拟空间被定义为结合一系列对象的三维空间。虚拟空间被用作最大的聚集体表现单位,同时也可被看作一个数据库。对于一个Java3D应用程序,必须定义一个虚拟空间才可以在“空间”中显示三维图像。(2)坐标系统默认情况下,Java3D的坐标系统是右旋的三维坐标体系(3)场景为了支持大型虚拟空间,Java3D提出了“场景Locale”的概念。一个场景和与它结合的坐标系一起组成了在虚拟空间之下的一个表现层。虚拟空间可以包含一个或多个场景。而所有其他的对象都附加在一个场景之中。3、Java 3D设计方法设计方法构造一个Java 3D应用程序,必须首先创建一个虚拟空间对象并且至少把一个Locale场景对象附加之上。然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。当一个包含场景图的观察对象被附加于一个虚拟空间,Java3D的渲染循环就开始工作。这样,场景就会和它的观察对象一起被绘制在画布(Canvas 3D)上。【例例6-12】最简单的最简单的Java 3D程序。程序。总结总结 本章的内容比较多,请教师根据教学时数的情况,选讲部分内容。
限制150内