第11章java图像图形处理.docx
《第11章java图像图形处理.docx》由会员分享,可在线阅读,更多相关《第11章java图像图形处理.docx(32页珍藏版)》请在冰豆网上搜索。
![第11章java图像图形处理.docx](https://file1.bdocx.com/fileroot1/2023-4/19/73f9cfbc-a5d2-4ab7-941f-3670ccccd185/73f9cfbc-a5d2-4ab7-941f-3670ccccd1851.gif)
第11章java图像图形处理
第十一章图形图像处理
在前边的章节的图形用户界面的处理中,已经看到了图像的应用。
本章将简要介绍如何在用户屏幕上绘制图形以及如何显示图像。
图形
在前边我们已经介绍了用户屏幕和容器的概念,也看到了如何在容器中添加组件。
一般来说,在用户屏幕上绘制图形其实就是在容器组件上绘制图形。
因此需要注意以下两点:
1)组件中的坐标系统
容器组件的坐标系统类似于屏幕的坐标系统,坐标原点(0,0)在容器的左上角,正x轴方向水平自左向右,正y轴方向垂直自上向下。
在java中,不同的图形输出设备拥有自己的设备坐标系统,该系统具有与默认用户坐标系统相同的方向。
坐标单位取决于设备,比如,显示的分辨率不同,设备坐标系统就不同。
一般来说,在显示屏幕上的计量单位是像素(每英寸大约90个像素),在打印机上是点(每英寸大约600个点)。
Java系统自动将用户坐标转换成输出设备专有的设备坐标系统。
2)图形环境(graphicscontext)
由于在组件上绘制图形使用的用户坐标系统被封装在Graphics2D类的对象中,所以Graphics2D被称之为图形环境。
它提供了丰富的绘图方法,包括绘制直线、矩形、圆、多边形等。
下边我们先介绍与绘制图形相关的类,再介绍绘制图形的方法和步骤。
11.1.1绘制图形的类
与绘制图形有关的类的层次结构如下:
|-
|
|-
|-
Graphics类是所有图形类的抽象基类,它允许应用程序可以在组件(已经在各种设备上实现)上进行图形图像的绘制。
Graphics对象封装了Java支持的基本绘制操作所需的状态信息,其中包括组件对象、绘制和剪贴坐标的转换原点、当前剪贴区、当前颜色、当前字体、当前的逻辑像素操作方法(XOR或Paint)等等。
Graphics2D类是从早期版本()中定义设备环境的Graphics类派生而来的,它提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
它是用于在Java(tm)平台上绘制二维图形、文本和图像的基础类。
GraphicsDevice类定义了屏幕和打印机这类可用于绘制图形的设备。
GraphicsEnvironment类定义了所有可使用的图形设备和字体设备。
GraphicsConfiguration类定义了屏幕或打印机这类设备的特征。
在图形绘制过程中,每个Graphics2D对象都与一个定义了绘制位置的目标相关联。
GraphicsConfiguration对象定义绘制目标的特征(如像素格式和分辨率等)。
在Graphics2D对象的整个生命周期中都使用相同的绘制标准。
Griphics和Graphics2D类都是抽象类,我们无法直接创建这两个类的对象,表示图形环境的对象完全取决于与之相关的组件,因此获得图形环境总是与特定的组件相关。
创建Graphics2D对象时,GraphicsConfiguration将为Graphics2D的目标(Component或Image)指定默认转换,所有Graphics2D方法都采用用户空间坐标。
一般来说,图形的绘制过程分为四个阶段:
确定绘制内容、在指定的区域绘制、确定绘制的颜色、将颜色应用于绘图面。
有三种绘制操作:
几何图形、文本和图像。
绘制过程中,Graphics2D对象的6个重要属性如下:
Paint颜料属性决定线条绘制的颜色。
它也定义填充图形的颜色和模式,系统默认的颜料属性是组件的颜色。
Font字体属性定义了绘制文本时所使用的字体,系统默认的字体是组件的字体设置。
Stroke画笔属性确定线型,如实线、虚线或点划线等。
该属性也决定线段端点的形状。
系统默认的画笔是方形画笔,绘制线宽为1的实线,线的末端为方形,斜角线段接口为45度斜面。
Transform转换属性定义渲染过程中应用的转换方法。
可以使绘制的图形平移、旋转和缩放。
Composite合成属性决定如何在组件上绘制叠放图形。
Clip剪切属性定义了组件上的一个区域边界。
图形绘制只能在该区域内进行。
一般情况下,我们使用Griphics2D对象的方法进行图形的绘制工作,Griphics2D对象的常用方法如下:
1)abstract voidclip(Shape s) 将当前Clip与指定Shape的内部区域相交,并将Clip设置为所得的交集。
2)abstractvoiddraw(Shape s) 使用当前Graphics2D上下文的设置勾画Shape的轮廓。
3)abstractvoiddrawImage(BufferedImage img,BufferedImageOp op,int x,int y) 呈现使用BufferedImageOp过滤的BufferedImage应用的呈现属性包括Clip、Transform和Composite属性。
4)abstractbooleandrawImage(Image img,AffineTransform xform,ImageObserver obs) 呈现一个图像,在绘制前进行从图像空间到用户空间的转换。
5)abstractvoiddrawString(String s,float x,float y) 使用Graphics2D上下文中当前文本属性状态呈现由指定String指定的文本。
6)abstractvoiddrawString(String str,int x,int y) 使用Graphics2D上下文中的当前文本属性状态呈现指定的String的文本。
7)abstractvoidfill(Shape s) 使用Graphics2D上下文的设置,填充Shape的内部区域。
8)abstract ColorgetBackground() 返回用于清除区域的背景色。
9)abstract CompositegetComposite() 返回Graphics2D上下文中的当前Composite
10)abstractPaintgetPaint() 返回Graphics2D上下文中的当前Paint
11)abstract StrokegetStroke() 返回Graphics2D上下文中的当前Stroke
12)abstract booleanhit(Rectangle rect,Shape s,boolean onStroke) 检查指定的Shape是否与设备空间中的指定Rectangle相交。
13)abstract voidrotate(double theta) 将当前的Graphics2DTransform与旋转转换连接。
14)abstract voidrotate(double theta,double x,double y) 将当前的Graphics2DTransform与平移后的旋转转换连接。
15)abstractvoidscale(double sx,double sy) 将当前Graphics2DTransform与可缩放转换连接。
16)abstract voidsetBackground(Color color) 设置Graphics2D上下文的背景色。
17)abstract voidsetComposite(Composite comp) 为Graphics2D上下文设置CompositeComposite用于所有绘制方法中,如drawImage、drawString、draw和fill它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。
18)abstractvoidsetPaint(Paint paint) 为Graphics2D上下文设置Paint属性。
19)abstractvoidsetStroke(Stroke s) 为Graphics2D上下文设置Stroke
20)abstractvoidsetTransform(AffineTransform Tx) 重写Graphics2D上下文中的Transform。
21)abstractvoidshear(double shx,double shy) 将当前Graphics2DTransform与剪裁转换连接。
22)abstractvoidtranslate(double tx,double ty) 将当前的Graphics2DTransform与平移转换连接。
23)abstractvoidtranslate(int x,int y) 将Graphics2D上下文的原点平移到当前坐标系统中的点(x, y)。
11.1.2简单几何图形类的层次结构
在包中定义了几何图形类,包括点、直线、矩形、圆、椭圆、多边形等等。
该包中各类的层次结构如下:
|-
|-
|-
|-
|-
|-
|-
|-
|-
|-
|-
|-
|-|-
|-
|-
|-
|-
|-
|-
|-
|-
|-
|-
下边我们简要介绍一下绘制几何图形类的功能及应用。
11.1.3路径类
路径类用于构造直线、二次曲线和三次曲线的几何路径。
它可以包含多个子路径。
如上类层次结构所描述,Path2D是基类(它是一个抽象类);和是其子类,它们分别以不同的精度的坐标定义几何路径;GeneralPath在及其以前的版本中,它是一个独立的最终类。
在版本中进行了调整与划分,其功能由Path2D替代,为了其兼容性,把它划为派生的最终类。
下边以GeneralPath类为例介绍一下路径类的功能与应用。
1.构造方法
构造路径对象的方法如下:
1)GeneralPath(int rule)以rule指定缠绕规则构建对象。
缠绕规则确定路径内部的方式。
有两种方式的缠绕规则:
用于确定路径内部的奇偶(even-odd)缠绕规则;用于确定路径内部的非零(non-zero)缠绕规则。
2)GeneralPath()以默认的缠绕规则构建对象。
3)GeneralPath(int rule,int initialCapacity)以rule指定缠绕规则和initialCapacity指定的容量(以存储路径坐标)构建对象。
4)GeneralPath(Shape s) 以Shape对象s构建对象。
2.常用方法
路径对象常用的方法如下:
1)voidappend(Shape s,boolean connect) 将指定Shape对象的几何形状追加到路径中,也许使用一条线段将新几何形状连接到现有的路径段。
如果connect为true并且路径非空,则被追加的Shape几何形状的初始moveTo操作将被转换为lineTo操作。
2)voidclosePath() 回到初始点使之形成闭合的路径。
3)booleancontains(double x,double y) 测试指定坐标是否在当前绘制边界内。
4)voidcurveTo(float x1,float y1,float x2,float y2,float x3,float y3)将三个新点定义的曲线段添加到路径中。
5)Rectangle2DgetBounds2D() 获得路径的边界框。
6)Point2DgetCurrentPoint() 获得当前添加到路径的坐标。
7)intgetWindingRule() 获得缠绕规则。
8)voidlineTo(float x,float y) 绘制一条从当前坐标到(x,y)指定坐标的直线,将(x,y)坐标添加到路径中。
9)voidmoveTo(float x,float y) 从当前坐标位置移动到(x,y)指定位置,将(x,y)添加到路径中。
10)voidquadTo(float x1,float y1,float x2,float y2) 将两个新点定义的曲线段添加到路径中。
11)voidreset() 将路径重置为空。
12)voidsetWindingRule(int rule) 设置缠绕规则。
13)voidtransform(AffineTransform at) 使用指定的AffineTransform变换此路径的几何形状。
以上只是列出了一些常用的方法,若需要了解更多的信息,请参阅JDK文档。
3.应用举例
如前所述,我们不能直接创建Graphics和Graphics2D绘图对象,要在组件上绘图,需要使用组件的方法先获得绘图环境对象的引用。
一般情况下,我们采用重写paint()方法的方式实现绘图,该方法在组件重建的时候被调用。
当然我们也可以使用组件的getGriphics()方法获得绘图对象。
图折线图
例在屏幕上画出如图的折线图。
程序的基本设计思想如下:
建立JFrame的派生类,重写paint()方法,在该方法中实现折线图的绘制。
程序参考代码如下:
/*绘制折线程序*/
import.*;
import.*;
publicclassDrawLineextendsJFrame
{
publicDrawLine()
{
super("Drawing2DPaint");
setSize(425,160);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidpaint(Graphicsg)11.1.4点
在java中有3个定义点的类:
、和Point。
前两个是Point2D的静态内部类,它们使用浮点型数计算点的坐标;最后一个是Point2D的子类,它使用整型数计算点的坐标。
Point2D是一个抽象类,虽然不能直接创建对象进行操作,但我们可以使用其内部类或子类对象进行操作。
我们可以使用如下的构造方法创建对象:
1)()创建具有坐标(0,0)的点对象。
2)(float x,float y)创建具有坐标(x,y)的点对象。
3)()创建具有坐标(0,0)的点对象。
4)(double x,double y)创建具有坐标(x,y)的点对象。
两种不同类型的构造方法构造不同精度的坐标点。
下边的两个语句分别构造两个不同的坐标点:
p1=new();线段
在java中提供了处理线段的类、和Line2D。
其中Line2D类是所有存储2D线段对象的惟一抽象超类;、是其子类,分别用于float型和double型用户坐标的定义。
我们可以使用如下的构造方法创建对象:
1)() 创建一个从坐标(0,0)到(0,0)的对象。
2)(float X1,float Y1,float X2,float Y2) 根据指定坐标(X1,Y1)和(X2,Y2)构造对象。
3)(Point2D p1,Point2D p2)根据p1和p2指定的两点构造对象。
4)() 创建一个从坐标(0,0)到(0,0)的对象。
5)(double X1,double Y1,double X2,double Y2) 根据指定坐标(X1,Y1)和(X2,Y2)构造对象。
6)Line2D.Double(Point2D p1,Point2D p2)根据p1和p2指定的两点构造对象。
例如,下列语句:
p1=new();
p2=new(100,100);
line1=new(p1,p2);
line2=new(0,0,100,100);
将构建两条(line1和line2)相同的从用户坐标(0,0)到(100,100)的线段。
线段类也提供一些获取线段的相关信息(如坐标值)、计算点到直线之间的距离、测试线段(是否在指定的边界内、是否与另一条线段相交等)、设置线段等方法。
这些方法不再列出,使用时再作简要介绍。
读者需要了解更多的信息时,可参阅JDK相关的文档。
3.应用举例
在前边的示例中,我们已经看到了绘制折线的方法和步骤。
有多种绘制线段的方法。
当绘制多个连续的线段(如上例的折线),一般来说,会采用路径的方式,先将各坐标点存入路径中,然后再进行绘制。
当绘制单个简单的线段时,会采用Graphics对象的drawLine()方法,需要指定直线的起点和终点坐标。
方法的格式如下:
图
voiddrawLine(intX1,intY1,intX2,intY2)
当定位坐标要求精度较高时,采用浮点数坐标,使用Graphics2D对象绘制图形。
下边我们举例说明其应用。
例在屏幕上绘制如图的图形。
程序的基本设计思想如下:
建立JFrame的派生类,重写paint()方法,在该方法中实现线段的绘制。
程序参考代码如下:
/*程序名*/
import.*;
import.*;
importclassDrawLineDemoextendsJFrame
{
publicDrawLineDemo()
{
super("DrawingLine");
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidpaint(Graphicsg)
{
(g);
(0,0,50,100);100f100f125f50f125f50f150f100f150f100f125f150f125f150f100f100f11.1.5直角矩形
与点、线段类的定义相似,也有三个类定义直角矩形:
Rectangle2D、和。
我们可以使用下边的构造方法创建直角矩形。
1)()
2)(float x,float y,float w,float h)
3)()
4)(doublex,double y,double w,double h)
其中,没有参数的构造方法将构造一个左上角的坐标为(0,0),高度和宽度为0的矩形。
参数x, y指定矩形的左上角坐标,w指定矩形的宽度,h指定矩形的高度。
直角矩形类也提供了相关的方法,不再一一列出,用到时再作介绍,下边举一个例子说明直角矩形的绘制。
例绘制如图的5个直角矩形。
程序的基本设计思想如下:
建立JFrame的派生类,重写paint()方法,在该方法中实现
图绘制直角矩形
直角矩形的绘制。
先定义第一个矩形,然后在此矩形的基础上,使用setRect()方法改变对象的位置。
setRect()方法说明如下:
voidsetRect(float x,float y,float w,float h)
四个参数与对象构造方法中所说明的相一致。
程序参考代码如下:
/*程序名*/
import.*;
import.*;
importclassDrawRectangleDemoextendsJFrame
{
publicDrawRectangleDemo()
{
super("DrawingRectangle");
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidpaint(Graphicsg)
{
(g);
Graphics2Dg2d=(Graphics2D)g;
floatx=50f,y=50f;50f50fdraw(rectangle1);10f10f50f50f圆角矩形
定义圆角矩形相关的类是RoundRectangle2D、和。
其层次结构与上述介绍的类相似。
可用的对象构造方法如下:
1)()
2)(double x,double y,double w,double h,doublearcw,double
arch)
3)()
4)(double x,double y,double w,double h,doublearcw,double
arch)
和直角矩形不同的是增加了两个参数arcw和arch,圆角弧的宽度和高度。
与绘制直角矩形相同,也可以多种方式绘制,除了采用了先定义圆角矩形对象,再使用Graphics2D对象的draw()方法绘制外,也可以直接使用图形对象的如下方法绘制圆角矩形:
1)voiddrawRoundRect(int x,int y,int w,int h,int arcW,int arcH)
2)voidfillRoundRect(int x,int y,int w,int h,int arcW,int arcH)
3.应用举例
下边举一个例子,说明矩形的几种绘制方法。
例分别以两种方法绘制直角和圆角矩形。
程序代码如下:
/*程序名*/
import.*;
import.*;
importclassDrawRectangleSummaryextendsJFrame
{
publicDrawRectangleSummary()
{
super("DrawingRectangle");
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidpaint(Graphicsg)
{
(g);
Graphics2Dg2d=(Graphics2D)g;
floatx=10f,y=50f;
r1=new(x,y,50f,50f);50f50f10f10f70f50f50f70f50f50f10f10f
图
11.1.6;
import.*;
importclassDrawEllipseDemoextendsJFrame
{
publicDrawEllipseDemo()
{
super("DrawingRectangle");
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
publicvoidpaint(Graphicsg)
{
(g);
Graphics2Dg2d=(Graphics2D)g;
floatx=10f,y=50f;
r1=new(x,y,100f,100f);100f100f11.1.7;
import.*;
importclassDrawArcsextendsJFrame
{
publicDrawArcs(