Download presentation
Presentation is loading. Please wait.
1
Java语言程序设计 清华大学出版社 第6章 java图形与图像处理
2
本章内容提要 1、图形与图像描绘 2、数字图像处理 3、java 3D基础
3
6.1 图形与图形的描绘 任何一个图形对象(java.awt.Component的子类)使用java.awt.Grephics类提供的绘图方法就可以画出线条、矩形、圆形等图形。该方法为: public void paint(Graohics g); 什么是程序? 算法、数据结构、程序设计方法、语言工具和环境都是用来描述数据和处理数据的。 标识符区分大小写
4
6.1.1 Graphics类 【例6-1】 绘制直线、矩形和圆的简单图形。 图6.1 组件的坐标系统
程序运行过程中,值不能改变的量称为常量 值可以改变的量称为变量。一个变量有一个名字,并在内存中占据一定的存储单元。变量的值就存储在变量所占据的内存单元中,所以,变量名代表的是变量值在内存中的地址。 变量类型 变量名1 [=值1],变量名2=[值2]……; “见名知意” “先定义,后使用” 图6.1 组件的坐标系统 【例6-1】 绘制直线、矩形和圆的简单图形。
5
Graphics类常用的绘图方法 方 法 说 明 drawLine(int x1, int y1, int x2, int y2)
方 法 说 明 drawLine(int x1, int y1, int x2, int y2) 绘制一条从(x1,y1)到(x2,y2)的直线 drawRect(int x, int y, int w, int h) 绘制一个顶点为(x,y),宽为w,高为h的矩形 drawOval(int x, int y, int w, int h) 绘制一个在顶点为(x,y),宽为w,高为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) 在(x,y)处显示字符串s drawImage(Image image, int x, int y, ImageObserver observer) 在(x,y)处显示图像image, observer为加载图像时的图像观察器 drawImage(Image image, int x, int y,int w,int h, ImageObserver observer) 在w宽h高的矩形区域内显示图像,图像能自动调整大小比例。
6
Graphics类的Set/get方法 getColor() 获得当前图形的色彩 setColor(Color c) 设置当前图形的色彩
getFont() 获得当前字体 setFont(Font font) 设置当前字体 getClip() 获取当前的剪贴板内容。 setClip(int, int, int, int) 将指定的矩形设置为当前的剪贴区。
7
【例6-2】 绘制用色彩填充的笑脸图形。 变量的范围 分配的存储空间不一样。
8
6.1.2 Java 2D 绘制时,只要将Graphics 对象强制转化为Graphics 2D对象就行。
9
【例6-3】设置线条粗细
10
画布Canvas 画布Canvas类是一个用来绘制图形的矩形组件,在画布中可以象在Applet中那样绘制各种图形,也可以响应鼠标和键盘事件。
11
1、创建 Canvas的构造方法没参数,所以使用简单的语句就可以创建一个画布对象: Canvas canvas1=new Canvas();
在创建了 Canvas对象后,一定要调用setSize()方法确定这个画布的大小。 Canvas具有自己的坐标系统,使用布局管理器可以确定它在其他组件中的位置,并且可以用布局管理器来进行版面布局。
12
2、常用方法 我们在进行程序设计时,经常把要实现的功能单独设计为一个类,而把显示这个功能设计成另一个,我们把实现功能的类称为业务逻辑层,而显示功能的类称为表现层。这样,把逻辑层和表现层分开,有利于实现代码重用。看下面的示例。 【例6-5】通过一个窗体的文本框输入圆的半径及坐标位置,在画布上绘制一个圆。以此例说明,逻辑层和表现层间的数据传递。
13
(a) 逻辑层和表现层间的数据传递 (b) 在画布上绘制圆形 图6.6 逻辑层与表现层的设计模式示例
14
6.2 数字图像处理 数字图像处理技术就是将图像信号转换成数字格式并利用计算机进行处理的过程。
我们要用到awt的Image类和java.awt.image包,awt的抽象类Image所有图形图像类的父类,java.awt.image包为创建和修改图像提供了技术支持。
15
图像文件 例:(1) 单一灰色 (2)渐变灰度。
16
6.2.2 图像的基本操作 图像最基本的操作有三种,它们是创建图像、加载图像和显示图像。 1、 创建图像对象
图像的基本操作 图像最基本的操作有三种,它们是创建图像、加载图像和显示图像。 1、 创建图像对象 由于图像最终要在屏幕中显示出来,java.awt的Component类提供了一个createImage()方法来生成Image图像对象。 CreateImage()方法有两种形式: Image createImage(ImageProducer imgProd) ; Image createImage(int width, int height) ;
17
2、 加载图像 获得图像的另一种方法是加载图像。这通过使用由Applet类定义的getImage()方法来实现。它有以下形式: Image getImage(URL url) Image getImage(URL url, String imageName)
18
3、显示图像 显示图像可以用drawImage()方法,drawImage()是Graphics类的方法。它有好几种形式,我们将要用到下面的一种: boolean drawImage(Image imgObj, int left, int top, ImageObserver imgOb) ;
19
【例6-8】用getImage()方法和drawImage()方法加载和显示图像。
20
6.2.3 双 缓 冲 由于加载图像需要时间,这时我们就会感觉屏幕在不断闪烁。
双 缓 冲 由于加载图像需要时间,这时我们就会感觉屏幕在不断闪烁。 为了解决这个问题,在内存或显存中开辟一块缓冲区,把加载的图像放到缓冲区中。当图像加载完毕,我们再把图像从缓冲区中调到屏幕上让它显示,由于从缓冲区读取数据的速度很快就不会出现闪烁了。这就称为双缓冲。
21
【例6-9】演示双缓冲技术的效果。 我们创建了一个Image对象,然后在这个Image对象上(而不是在屏幕上)画图。画图需要用一个Graphics对象。这个Graphics对象可以通过getGraphics()方法来获得。下面构造一个Graphics对象gc,并用红色填充图像。 Canvas c = new Canvas(); Image test = c.createImage(200, 100); Graphics gc = test.getGraphics(); gc.setColor(Color.red); gc.fillRect(0, 0, 200, 100); 这个图像是不可见的,仅仅存在于内存中。为了真正显示这个图像,需调用drawImage()方法。
22
6.2.4 图像处理技术 1、像素点数组的构成
23
像素点是一个具有Alpha(透明度)、Red(红)、Green(绿)和Blue(蓝)四个分量表示的整数,记作0xAARRGGBB。其中A、R、G、B的取值从0~f(十六进制)。
红色: 0xffff 绿色: 0xff00ff00 蓝色: 0xff0000ff 白色: 0xffffffff 黑色: 0xff000000 图像的像素点其排列如图6.14所示,我们按从左往右、从上往下的顺序取出像素点,构成一整型数组。
24
图6.14 像素数组元素的排列
25
2、 MediaTracker类 MediaTracker类用于加载多媒体图像,使用时,先生成一个MediaTracker对象,再用它的addImage()方法来加载图像。addImage()方法有以下一般形式: void addImage(Image imgObj, int imgID) void addImage(Image imgObj, int imgID, int width, int height)
26
3、ImageProducer接口和MemoryImageSource 类
ImagePruducer是一个用于生成图像数据对象的接口。实现该接口的对象要用整数型数组或字节型数组生成Image对象。 MemoryImageSource是用于生成新的图像的类。它的构造函数如下: MemoryImageSource(int width, int height, int pixel[ ], int offset, int scanLineWidth)
27
4、PixelGrabber类 PixelGrabber类的作用是从现有的图像中提取像素数据构造一个像素数组。
在使用PixelGrabber时,首先需要生成一个足够大的int型的数组来存储像素数据,然后生成一个PixelGrabber实例对象,将提取到的图像数据存入到一个矩形区域中。最后,这个实例对象中调用grabPixels()方法将数据值放进像素数组中。
28
【例6-11】将图像进行反相处理示例。
29
6.3.1 Java 3D概述 Java 3D的安装和运行 : 到其官方网站:
下载最新的系统安装程序。 Java 3D安装完毕后,在JDK目录下的jre\lib\ext子目录下,应有四个.jar文件:j3daudio.jar、j3dcore.jar、j3dutils.jar、vecmath.jar,在JDK目录下的jre\bin子目录下,应有J3D.dll、j3daudio.dll、J3DUtils.dll文件。另外,在demo目录下的java3d中有系统提供的示例程序。
30
6.3.2 Java 3D程序设计 1、Java 3D的基本体系结构
31
2、几个基本概念 (1)虚拟空间 在Java3D中,虚拟空间被定义为结合一系列对象的三维空间。虚拟空间被用作最大的聚集体表现单位,同时也可被看作一个数据库。 对于一个Java3D应用程序,必须定义一个虚拟空间才可以在“空间”中显示三维图像。
32
(2)坐标系统 默认情况下,Java3D的坐标系统是右旋的三维坐标体系 (3)场景 为了支持大型虚拟空间,Java3D提出了“场景Locale”的概念。一个场景和与它结合的坐标系一起组成了在虚拟空间之下的一个表现层。虚拟空间可以包含一个或多个场景。而所有其他的对象都附加在一个场景之中。
33
3、Java 3D设计方法 构造一个Java 3D应用程序,必须首先创建一个虚拟空间对象并且至少把一个Locale场景对象附加之上。然后,构建出需要的场景图像,它由一个分支组结点开始并且包括至少一个观察平台对象,而场景图就是附加于这个观察平台。当一个包含场景图的观察对象被附加于一个虚拟空间,Java3D的渲染循环就开始工作。这样,场景就会和它的观察对象一起被绘制在画布(Canvas 3D)上。
34
【例6-12】最简单的Java 3D程序。
35
总结 本章的内容比较多,请教师根据教学时数的情况,选讲部分内容。
Similar presentations