Java 2D API - 1. 基本概念

Java 2D API扩展AWT包,对二维图形、文本及成像功能提供了支持,可用于开发复杂的界面、绘图软件和图像编辑器。Java 2D对象位于用户坐标空间(User coordinate space),当对象呈现在屏幕或打印机,用户空间坐标转换为设备空间坐标(device space coordinate)。下面两个类对 Java 2D API十分重要:

  • Graphics
  • Graphics2D

Java 2D API提供了如下功能:

  • 为显示设备和打印机等提供了统一的渲染模型;
  • 提供了大量的几何图元(geometric primitive),如曲线(curves)、方形(rectangle)、椭圆(ellipse),并包含几乎可生成任何几何图形的机制;
  • 图形、文本和图像的hit detection 机制;
  • 用于重叠图像对象渲染的混合模型;
  • 增强颜色支持;
  • 打印复杂的文档;
  • 渲染的质量控制。

1. 坐标系

Java 2D API 包含两套坐标空间:

  • 用户空间(User space)  - 绘制图形区域坐标系统
  • 设备空间(Device space)  - 输出设备如屏幕、窗口或打印机的坐标系统

用户空间是编程时所使用的坐标空间,该坐标体系是一个与设备无关的逻辑坐标系统。

用户空间坐标的原点在左上角,x坐标向右递增,y向下递增,如下图所示。所有的坐标以整数指定(大多时候使用整数就足够了,也提供了float和double支持)。

设备空间与具体设备相关,虽然屏幕坐标系统和打印机的坐标系统相差很大,但是对Java程序没有任何影响,编程时完全不用考虑。

2.  Java 2D 渲染

Java 2D API为不同设备提供了统一的渲染模型,不管目标设备是打印机还是屏幕,渲染过程在API层次都是一样的。当需要显示某个组件,其paint() 或update() 方法都能以配置合适的Graphics 调用。

Graphics属性:

  • Color: 当前绘制颜色(java.awt.Color)。所有的绘制,着色和纯文本输出都将以指定的颜色显示;
  • Font:当前字体(java.awt.Font)。用于所有纯文本输出的字体。
  • Clip:java.awt.Shape类型,用于定义几何形状。该特性定义进行绘制的区域。通常这一形状与整个图形环境相同,但也不一定如此。
  • ClipBounds:java.awt.Rectangle对象,表示包围Clip属性所需的Shape类型的最小矩形。只读属性。
  • FontMetrics:java.awt.FontMetrics只读特性。该对象包含关于图形环境中当前起作用的Font的信息。获取该信息的机制被LineMetrics类取代。
  • Paint Mode:该特性控制环境使用当前颜色的方式。

Graphics2D类扩展Graphics类,提供了更多的图形绘制功能。包括:

  • stroke 和 paint属性(draw方法),用于渲染几何图元的边框;
  • paint 属性 (fill方法),使用特定颜色或图案填充图形;
  • font 属性,(drawString方法)渲染文本,通过font属性将字符串转换为字形(glyph),然后通过paint属性填充颜色或图形;
  • 渲染图像(drawImage方法)。

另外,Graphics2D还包含Graphics的方法,如drawOval, fillRect。

以上所有方法可以分为两类:

  1. 绘制图形的方法
  2. 渲染图形的方法

第二类方法通过设置 Graphics2D 的属性值实现以下渲染功能:

  • 改变笔画宽度
  • 改变笔画之间的连接方式
  • 指定需要渲染的区域
  • 对图形进行平移、旋转、缩放等
  • 设置图形填充的颜色和图案
  • 设置多个图形组合的方式

要使用Graphics2D的功能,需要对 Graphics 进行强制转换:


publicvoid paint(Graphics g){

Graphics2D g2 = (Graphics2D) g;

……

}

下面以具体图形展示 Graphics2D 的不同特性:



pen属性,应用于图形边框。该stroke属性允许以任意的点尺寸(point size)、虚线模式(dashing pattern) 、末端链接方式绘制线条。



fill属性,用于图形内部。该paint属性支持以纯色、渐变色或图纹等不同方式填充图形。



compositing属性,用于重合对象的渲染、



transform属性,将渲染对象从用户空间转换为设备空间时应用的属性。包括平移、渲染、缩放等。



clip属性,通过Shape对象指定需要渲染区域的。



font属性,将文本转换为字形(glyphs)。



渲染建议(Rendering hints),在渲染的速度和质量间进行取舍。例如,你可以指定是否使用反锯齿(antialiasing)。

3. 几何图形

Java 2D API提供了点、线、矩形、弧线、椭圆、曲线等一套标准的几何图形。这些基本图形都定义在 java.awt.gemo包中。任何其他的形状都可以通过这些基本图形进行组合获得。

Shape 接口表示一个几何图形,包含边框和内部区域。该接口定义的方法功能包括:描述和检查二维几何对象,支持曲线片段和图形子片段,而Graphics类只支持直线片段。

下面是对java.awt.geom 包中各个类的简介。

(AffineTransform, Arc2D, Area, CubicCurve, Dimension2D, Ellipse2D, FlatteningPathIterator, GeneralPath, Line2D, Path2D, QuadCurve, Rectangle2D, RectangularShape, RoundRectangle2D)

黄色部分是遗留类。

3.1 Points

Point2D 类定义了一个 (x,y) 坐标空间的点。在Java 2D API中 "point"不等价于 pixel。"point" 没有面积,不包含颜色,并且不能被渲染。

Points 用于创建其他的图形。 Point2D中包含一个计算两点之间距离的方法。

3.2 Lines

Line2D 是用于表示“线”的抽象类。线的坐标可以用 double 表示。Line2D类包含多个用于设置“线”终点的方法。也可以使用GeneralPath 类创建直线。

3.3 Rectangular Shapes

Rectangle2D, RoundRectangle2D, Arc2D和Ellipse2D 图元都扩展自 RectangularShape 类,该类实现了Shape接口。

3.4 Quadratic and Cubic Curves (二次和三次曲线)

QuadCurve2D 用于创建二次曲线。二次曲线通过两个端点和一个控制点定义。

CubicCurve2D 类用于创建三次曲线。三次曲线通过两个端点和两个控制点定义。


二次曲线



三次曲线


3.5 Arbitrary Shapes

GeneralPath类可用于创建任意形状。该类通过指定图形的边框创建任意形状。如,下图用三条直线和一条三次曲线创建曲线:

3.6 Areas

通过Area类,可以对两个Shape 对象执行布尔操作,如(合并、交叉、相减)。该技术,也被称为区域几何学(Constructive area geometry),可用来迅速创建复杂的图形。

4. 文本(Text)

Java 2D API包含许多文本渲染功能,如字符串渲染,字体设置以及文本布局。

绘制静态字符串方法:调用Graphics 类的 drawString方法。通过Graphics 的 setFont方法指定字体。

如果你需要实现自己的文本编辑程序,或需要更好的控制文本的布局,则可以使用 java.awt.font包中的类。

4.1 字体(Fonts)

字体中字符的形状的表示称为字形(glyph)。单个字符或多个字符可能以一个或多个glyph表示。例如, á可能以两个glyph表示,而连字fi则可能以一个glyph表示。

可以将字体(font)看做是一个glyph集合。一个字体可以包含多个属性(faces),如斜体(italic)、常规(regular)和加粗等,单个字体的不同faces具有类似的排版特性,因此可以看做是同一字体的成员。换句话说,特定风格的字形(glyph)集合构成一个font facefont face集合构成一个font familyfont family集合构成一个计算机上可用的所有字体。

Java 2D API通过Font实例指定字体。通过如下方法可以获得当前系统所有可用字体:


GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

String[] fonts = ge.getAvailableFontFamilyNames();

for (String s : fonts) {

System.out.println(s);

}

4.2 文本布局(Text Layout)

在显示文本前,必须对其进行排版,以合适的字形显示对应的字符。下面是Java 2D 管理文本布局的两种机制:

  • TextLayout管理文本布局(text layout),文本高亮(highlighting)及hit detection。TextLayout可用于处理大部分情况,包括混合字体文本、混合语言和双向文本等。
  • 可以用于Font类创建自己的GlyphVector对象,然后使用Graphics2D类渲染GlyphVector。如此能够完全控制文本的形状和位置。

4.3 文本的渲染建议(Rendering Hints for Text)

Java 2D API 通过rendering hints控制图形和文本渲染的质量。Rendering hints封装在java.awt.RenderingHints类中。

对文本来说,该功能指反锯齿(也称为平滑边角)。例如,KEY_TEXT_ANTIALIASING可单独用于文本的平滑处理。

5. 图像(Images)

在Java2D API中,一张图片就是一个矩形的像素二维数组,每个像素(pixel)表示特定位置的颜色,而维度表示图片的宽度和高度。

java.awt.image.BufferedImage是表示图片最重要的类。Java2D API 通过BufferedImage表示图片将其载入内存,从而可以直接访问。

可直接创建BufferedImage,也可以通过载入外部图片(如PNG、GIF等)创建BufferedImage。

不管是哪种方式,Java2D API都允许在图片上进行绘制。所以,图形不局限于摄影类型图片,也包含弧线、文本甚至其他的图片,都可以绘制在一张图片上,如下所示:

Java 2D API允许对BufferedImage进行过滤,并且内置了许多过滤器。例如,ConsolveOp 过滤器可用于模糊(blur)或锐化(sharpen) 图片。处理后的图片可以输出到屏幕上,打印出来或者输出为PNG、GIF等格式进行保存。

6. 打印(Printing)

所有的Swing 和 Java 2D 图像(graphics), 包括复合(composited)图形图像,都可以通过Java2D Printing API到处到打印机。该API 还提供了组成文本的功能,从而可以对打印进行控制,如改变页面打印顺序等。

输出到打印机和输出到屏幕类似:打印系统控制页面何时打印,绘制系统控制一个组件何时在屏幕显示。

Java 2D Printing API 的打印系统使用callback模型控制页面的打印。通过应用程序提供待打印文本,打印系统控制何时对页面进行打印。

下面的两个特性对支持打印十分重要:

  • 任务控制(Job control) - 用于发起和控制打印任务,包括显示标准打印和设置对话框。
  • 页码导航(Pagination) - 在打印系统发出请求时,渲染每个页面。

当需要将页面图像化,打印系统以特定配置的Graphics调用应用的 print 方法。要使用Java 2D API特性,需要将Graphics 转换为Graphics2D,和绘图时一样。

时间: 2024-10-06 00:43:26

Java 2D API - 1. 基本概念的相关文章

Java 2D API - 2. Graphics 入门

Java 2D API强大而复杂,不过大多时候我们只需使用java.awt.Graphcis类的部分功能.下面的内容将覆盖大多数的常见应用. Graphics 类中的方法大致可以分为两类: Draw and fill方法,用于绘制基本的图形.文本和图像: 属性设置方法,用于控制绘制和填充的效果.setFont()和setColor()等方法就属于这类方法. 下图显示这些方法和图像的对应关系: 1. drawString() 用于绘制文本: g.drawString("Hello", 1

Java IO学习笔记:概念与原理

Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件.内存.控制台.网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分. 二.分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序. 2.

java持久化API

一.简介 JPA(java持久化API)以Enitity为核心,主要功能是将实体映射到底层数据库表,然后通过在应用程序中使用JPA的EntityManager来操作Entity,而JPA实现则将这种操作转换为对底层数据表的操作. JPA是规范,并不是任何具体的ORM框架,所以在系统中使用JPA时,只是用的规范,具体还是会有一种ORM的实现,例如Hiernate,TopLink等. 如图所示是JPA和ORM框架之间的关系 二.JPA规范简介 JPA操作过程中,最常用的三种组件: 1.实体 实体其实

[Java Performance] Java集合API

Java集合API Java 7提供了至少58个功能和实现各异的集合类型,在不同的场景下选择合适的集合类型十分重要.因为,程序的性能和集合类型的选择有莫大的关联. 关于选择哪个集合类型,第一个需要考虑的就是程序使用的算法和操作方式.实际上这就是从数据结构的出发点来看问题,和使用的语言无关. 比如,LinkedList不适合用在搜索操作较多的场合:如果需要以O(1)的开销从集合中得到某个元素,那么使用HashMap:如果集合中的元素需要保持有序,那么使用TreeMap而不要试图自己来对集合排序:如

匿名对象,内部类,包的声明与访问,访问修饰符,代码块,java的API equals toString方法整理

匿名对象  匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. public class Person{ public void eat(){ System.out.println(); } }创建一个普通对象person p=new person();创建一个匿名对象new person(); 匿名对象的特点: 1创建匿名对象直接使用,没有变量名. new Person().eat() //eat方法被一个没有名字的Person对象调用了. 2,匿名对象在没有指定其

Java基础教程(4)--面向对象概念

??如果你之前从来没有使用过面向对象编程语言,那么在学习Java之前需要先理解几个有关面向对象编程的基本概念.这篇教程将会向你介绍对象.类.集成.接口和包的概念,以及这些概念是如何与现实世界相关联,并介绍这些概念在Java语言中的体现. 一.对象 ??对象将状态和行为绑定在一起,它可以被用来模拟你能列举出的现实世界中的任何实体.这一小节将会解释如何在对象中表示状态和行为,介绍封装的概念,并解释这种软件设计方式的好处. ??对象是理解面向对象技术的关键.环顾四周,你会发现许多现实世界中的对象:狗.

全面挖掘Java Excel API 使用方法

使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件.这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件,

新增的Java MapReduce API

http://book.51cto.com/art/201106/269647.htm Hadoop的版本0.20.0包含有一个新的 Java MapReduce API,有时也称为"上下文对象"(context object),旨在使API在今后更容易扩展.新的API 在类型上不兼容先前的API,所以,需要重写以前的应用程序才能使新的API发挥作用. 新增的API 和旧的API 之间,有下面几个明显的区别. 新的API 倾向于使用虚类,而不是接口,因为这更容易扩展.例如,可以无需修改

Atitit. C# java 的api 目录封装结构映射总结

Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent thread System.Threading java.lang.Thread collection System.collection java.util.collection Io Sys.io sys.text sys.xml sys.data.sql sys.data sys.web s