Java的绘图世界--Java 2D

转载 2004年07月10日 17:22:00

发信人: ttlink (SkyWalker), 信区: Java
标  题: Java的绘图世界--Java 2D
发信站: 日月光华 (2002年12月20日01:13:23 星期五), 站内信件

http://www.cn-java.com/target/news.php?news_id=1984


一、简介

Java 2D API是JFC (Java Fundation Classes)的一员,加强了传统AWT( Abstract
Windowing Toolkit )的描绘功能。在 JDK1.2中已经支援 Java 2D 的使用。透过Java
2D API ,Programmer 可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图
形做旋转( rotate)、缩放( scale)、扭曲( shear)等。如图一所示,Programmer
 透过2D API所提供的功能,简单地利用不同类型的线或是填色效果绘出统计图,以区分
出不同的资料。当然, 2D API还有许多增强AWT能力的部分,像是处理影像档案可以有
不同的滤镜(filter)效果、对於任意的几何图形亦能做碰撞侦测(hit detection)、
图形重叠混色计算(composite)等功能。文中将会对这些技术做概略性地介绍。

二、Java 2D API Packages

JDK1.2中关於2D API的Packages如下所述:

2.1 java.awt

java.awt包含了一些新增的2D API 类别(classes)和介面(interfaces )。其中
Graphics2D继承自 java.awt.Graphics ,是描绘2D图形的物件(object)。如同前版本
的JDK所使用的绘图模式一样,当有物件 要被描绘时,paint或是update method会自动
根据适当的 Graphics Context 来做绘图的工作。所谓的Graphics Context是与
Graphics Object相关状态属性(state attribute)的集合。在Graphics2D中新增了许
多状态属性,像是Stroke、 Paint、Clip、 Transform等。

2.2 java.awt.geom

java.awt.geom 则包含可以勾勒任何形状的 GeneralPath类别。它可以由许多不同种类
的subpath构成,像是lines和 quadratic curves 等。为了兼顾方便性,此package中更
定义了许多基本几何图形,包括Arc2D 、CubicCurve2D、 Line2D等。这些类别都有两种
型态,分别是Float precision与Double precision。此外,还有一种特别的图形类别:
Area,它支援Constructive Area Geometry( CGA)。CGA是对既有图形物件做布林运算
(Boolean Operation)而产生新图形物件的过程。如图二所示, Areas支援联集(
union)、交集( intersection)、差集(subtraction )、Exclusive OR (XOR)等
布林运算。最後, AffineTransform 类别则提供图形物件做Scale、Shear 、Rotate等
座标上的转换。

2.3 java.awt.font

java.awt.font 中定义了 TextLayout类别,负责建构text shape、执行适当的 text
operations,如碰撞侦测与打光 (highlighting)等,以及决定text的适当位置与顺序。


2.4 java.awt.image

Java 2D API支援三种影像模式。包括 producer/consumer (push) model、
immediatemode model和 pipeine(pull) model。Push model 在前版本的JDK中支援。而
Pull model 则在即将出现的 Java Advanced Imaging AP中会支援。於此,我们只探讨J
DK1.2中出现的Immediate mode imaging model。在此model下, Programmer可以透过2D
 API对image data( BufferedImage or Raster)做滤镜的效果。在Package
java.awt.image中,immediate mode imaging APIs 可以被归为六大类: interfaces、
image data classes、 image operation classes、sample model classes、 color
model classes和 exceptions。其中 operation classes 即定义了许多 filter ,包括
了 AffinTransformOp 、BandCombineOp、 ColorConvertOp、 ConvolveOp、 LookupOp
、 RescaleOp等。透过以上所提之滤镜,可以做到 geometrically transform、blur、
sharpen、enhance contrast、 threshold和color correct images等效果。如图三所示
,source image经过filter,产生出新的图形。

2.5 java.awt.color

Package java.awt.color定义了class ColorSpace。此 class提供 Programmer转换色盘
的method。

2.6 java.awt.print

Java Printing API提供Programmer 列印AWT和Java 2D graphics(composit ed
graphics和 images)的method。并可让User设定 print的属性,如双面列印等。

三、Java 2D Programming初步

 解了Java 2D API 各相关的package资讯之後,可以进一步地实做一些简单的Applicat
ions来体认2D的美妙。在那之前,我们先学习一些基本的2D programming codes 。

3.1基本步骤

绘图的第一个步骤是产生 Graphics2D Object 。 接著是设定你所 要的状态属性。例
如你想要对一物件做渐层式的填色,可以设定属性 Paint为 GradientPaint。最後再呼
叫 Graphics2D所提供的redering method ,fill或是draw,完成整个绘图的程序。以下
即是此基本步骤的范例程式码:

 


import java.awt.*;

import java.awt.geom.*;

public void paint(Graphics g)
{
  Ellipse2D.Float shape;
  GradientPaint gp;
  // create a Graphics2D

  Graphics2D g2 = (Graphics2D) g ;

  // create a Ellipse2D (x,y,w,h)

  shape = new Ellipse2D.Float (200,200,60,60);

  // create a Cyclic GradientPaint

  // (x1,y1,color1,x2,y2,color2, boolean cyclic)

  gp = new GradientPaint (180,190,Color.yellow,220,210,Color.red,true);

  g2.setPaint(gp);

  g2.fill(shape);

}

 

 

3.2 如何画线

在jdk尚未支援 2D图形之前, Programmer只可以画出直的、相同粗细的线条。现在,我
们就教您如何透过2D API绘出不同粗细的线条及圆滑的曲线。在package
java.awt.geom中提供了Line2D、 QuadCurve2D及 CubicCurve2D等 classes,让
Programmer轻松地绘出想要的线条。范例程式码如下所示:

 


import java.awt.geom.*;

Line2D.Float line;

CubicCurve2D.Float cubic;

// create a Line2D

line = new Line2D.Float(20,390,200,390);

// create a CubicCurve2D,比直线多了两个控制点

cubic = new CubicCurve2D.Float(70,100,120,50,170,270,220,100);

// 设定描绘的粗细

g2. setStroke(new BasicStroke(2.0f));

g2.setColor(Color.blue);

g2.draw(line);

line = new Line2D.Float(30,400,250,400);

// 设定描绘的粗细

g2. setStroke(new BasicStroke(5.0f));

g2.draw(line);

 

 


3.3显示字串

透过Java 2D, Programmer可以显示更细致的文字。如范例程式码的效果:显示出外边
为淡蓝色的字串 " Font Test "。

 


import java.awt.font.*;

Shape sha;

FontRenderContext frc =g2.getFontRenderContext();

TextLayout tl = new TextLayout("Font Test",new Font("Modern",
                                     Font.BOLD+Font.ITALIC,20),frc);

sha=tl.getOutline(AffineTransform.getTranslateInstance(50,380));

g2.setColor(Color.blue);

g2.setStroke(new BasicStroke(2.0f));

g2.draw(sha);

g2.setColor(Color.white);

g2.fill(sha);

 


3.4图档处理

之前,若希望图形有滤镜的效果,必须透过可以处理图形的绘图软体来帮忙。在2D API
中则提供了一些简单的method,使得 Programmer可以直接用程式码来对图形作滤镜效果
的控制。下面即介绍其中一种效果。范例程式码如下所示:

 


float[] elements = {0.0f, -1.0f, 0.0f,-1.0f, 4.f, -1.0f,0.0f, -1.0f, 0.0f};

Image img = Toolkit.getDefaultToolkit().getImage("boat.gif");

int w = img.getWidth(this);
int h = img.getHeight(this);

BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

Graphics2D big = bi.createGraphics();

big.drawImage(img,0,0,this);

BufferedImageOp biop = null;

AffineTransform at = new AffineTransform();

BufferedImage bimg = new
BufferedImage(img.getWidth(this),img.getHeight(this),
                       BufferedImage.TYPE_INT_RGB);

Kernel kernel = new Kernel(3,3,elements);

ConvolveOp cop = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);

cop.filter(bi,bimg);

biop = newAffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

g2 = (Graphics2D)this.getGraphics();

g2.drawImage(bimg,biop,0,0);

 

 

 


四、参考资料
[1] Java Tutorial-2D
Graphics-,http://java.sun.com/docs/books/tutorial/2d/index.html
[2] Java 2D Progrmmer's Guide,Chapter 3-Geometries- http ://java.sun.com/p
roducts/jdk/1.2/d ocs/guide/2d/spec /j2d-geom.fm2.htm l
[3] [3]Java 2D Programmer;s Guide,Chapter 5-imaging- htt p://java.sun.com/
products/jdk/1.2/ docs/guide/2d/spe c/j2d-image.fm2.h tml

--
---
   Everyday is a winding road
---
ftp://10.11.202.202
※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM:the city of Vampire]                                                        

Java:Java2D高级绘图

Java 2D高级绘图 知识要点:  第一节  Java 2D的增强功能  概述、AWT图形能力的不足、Java 2D API  第二节  图形绘制的基本方法  转换Graphics2D对象、...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2015年11月09日 10:17
  • 1931

菜鸟学Java之 Java2D 多线程绘图

1 绘制动态连线。 我需要在画布的两点间绘制一条可动态展示(连线可以一段段的按时间增长)的连线,于是我打算使用多线程进行绘制,于是我建立了一个自己的线程类: class MyThread im...
  • xuanyuanlei1020
  • xuanyuanlei1020
  • 2015年03月06日 10:59
  • 1400

Java标准教程:Java 2D绘图--第5章 使用图像

在概述一节中,图像使用宽度和高度描述,以像素为单位,有自己独立于绘图平面的坐标系。使用图像时有很多普通的任务。l         将图像外部的GIF, PNG JPEG 图像文件中加载到Java ...
  • Uoooo
  • Uoooo
  • 2011年02月24日 15:07
  • 4027

java入门教程-11.5Java Graphics2D类的绘图方法

Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的...
  • softn
  • softn
  • 2016年05月28日 08:58
  • 1348

OpenGL ES开发绘制2D图形

package com.example.tyxiong.myapplication;import android.app.Activity; import android.opengl.GLSurfa...
  • sinat_35073873
  • sinat_35073873
  • 2016年11月08日 20:23
  • 968

Android 2D绘图解析之 Canvas,Paint

【Android 2D绘图解析】系列文章将全面介绍Android绘图相关,这是第一篇,简单介绍下如何利用Android API进行一些简单图形的绘制,绘图的前提是需要继承自View,然后重写它的onD...
  • leejizhou
  • leejizhou
  • 2016年05月30日 08:44
  • 10012

Android-2D绘图

概述Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0大部分2D使用的api都在android.graphics和android....
  • yangshangwei
  • yangshangwei
  • 2016年04月10日 23:55
  • 3997

QT中的2D绘图的总结

因为QT属于现学现用,由于要用到QT 2D绘图,所以临时学习了一下,当然只是浅尝辄止,并没有对其进行深入的研究,只是能作为一个工具去使用去完成一定的任务,现在记录下来以便以后用到时可以快速的捡起。 ...
  • Frozen_Wang
  • Frozen_Wang
  • 2015年08月09日 18:13
  • 860

iOS 2D绘图详解(Quartz 2D)之概述

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow前言:最近在研究自定义控件,由于想要彻底的...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年10月21日 11:55
  • 3318

opengl编程学习笔记(三)(2D绘图)

在opengl中可以绘制二维图像,分为两种,BITMAP和image1.bitmap和image的区别有:bitmap中对图像的每个像素只存储一位(0或1),用来表示用当前颜色绘制还是不绘制,而ima...
  • leonwei
  • leonwei
  • 2009年04月07日 10:32
  • 10923
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的绘图世界--Java 2D
举报原因:
原因补充:

(最多只允许输入30个字)