《Java数字图像处理:编程技巧与应用实践》——1.2 Java 2D API

1.2 Java 2D API

当Graphics向下转型为Grahpics2D时,Java 2D的图形绘制引擎得以访问,一个功能更加丰富的图形库呈现在读者眼前,它就是Java 2D API。如果你问笔者Java 2D与Swing有何关系,可以很认真地说,二者毫无瓜葛,Java通过引入Swing、Java 2D与Java 3D,极大地丰富了Java的图形功能,使应用程序接口更加完善,为各种可能的图形开发提供了可靠保证与全面支持,从而也使得学习Java图形方面的知识时不再那么无助了。下面来看一下Java 2D对图形支持与改进都包括了哪些:

  • 为显示设备与打印机提供统一的绘制引擎。
  • 一个广泛的几何形状支持。
  • 文档打印支持。
  • 可控制的绘制质量。
  • 增强的色彩支持。
  • 文字、形状、图像绘制检测。

1.2.1 基本的Java 2D图形绘制

Java 2D图形绘制支持的图形形状如图1-1所示。

Java 2D图形绘制最常见的是将绘制代码放在paintComponent(Graphics g)方法中,显示时Swing会首先调用paint()方法。该方法会调用下面的三个方法:

  • paintComponent(Graphics g)
  • paintBorder(Graphics g)
  • paintChildren(Graphics g)

在绝大多数情况下,图形绘制只需要重载paintComponent()方法来实现。一个基本图形绘制代码如下:

public void paintComponent(Graphics g)
{
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);         //反锯齿
    g2d.setPaint(Color.BLUE);       // 设置画笔颜色
    g2d.drawRect(10, 10, 50, 50);   // 绘制矩形
    g2d.dispose();          // 释放资源
}

1.2.2 使用Java 2D实现太极图形绘制

太极在中国源远流长,黑白相间的太极图案已经是一个文化标志,这里将使用Java 2D的图形绘制技术实现太极图案的绘制。如果仔细观察太极图案,就会发现它是非常精准的黑白对称图案。可通过设置画笔颜色来实现黑白颜色控制,利用Java 2D Area对图形布尔操作的支持实现太极图形绘制。Java 2D Area对图形Shape对象进行支持的四种布尔操作如下。

  • Union(加操作):保留两个几何形状及其重叠部分。
  • Subtraction(减操作):从第一个几何形状减去与第二个几何形状重叠的部分。
  • Intersection(可以看成与操作):只保留两个几何形状重叠的部分。
  • Exclusion-or(XOR异或操作):保留两个几何形状不重叠的部分。

这四种操作的示意图如图1-2所示。

实现太极图案的相关代码如下:

protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                   RenderingHints.VALUE_ANTIALIAS_ON);
    // R = 150
    Shape lefthalfCirle = new Ellipse2D.Double(10,10, 300,300);
    // R = 150
    Shape righthalfCircle = new Ellipse2D.Double(10,10, 300,300);
    // R/2 = 75
    Shape innerCircle1 = new Ellipse2D.Double(85,10, 150,150);
    // R = 150
    Shape innerCircle2 = new Ellipse2D.Double(85,160, 150,150);
    Shape rectangel1 = new Rectangle2D.Double(160, 10, 150, 300);
    Shape rectangel2 = new Rectangle2D.Double(10, 10, 150, 300);  

    Area left = new Area(lefthalfCirle);
    Area right = new Area(righthalfCircle);  

    Area area11 = new Area(rectangel1);
    Area area22 = new Area(rectangel2);  

    left.subtract(area11);
    right.subtract(area22);  

    Area inner1 = new Area(innerCircle1);
    Area inner2 = new Area(innerCircle2);  

    left.add(inner1);
    right.add(inner2);

    // trick is here !!!
    right.subtract(inner1);  

    // create minor circle here!!!  // ++ 60, R = 150
    Shape minorWhiteCircle = new Ellipse2D.Double(150,70, 20,20);
    Shape innerBlackCircle = new Ellipse2D.Double(150,230, 20,20);  

    // draw two big frame shape here...
    g2.setPaint(Color.WHITE);
    g2.fill(left);
    g2.setPaint(Color.BLACK);
    g2.fill(right);  

    // draw minor circle here!!!
    g2.fill(minorWhiteCircle);
    g2.setPaint(Color.WHITE);
    g2.fill(innerBlackCircle);
}

运行源文件中第1章中的完整代码可以看到一个标准的太极图案。

书中所有完整的源代码均已打包上传至www.hzbook.com和github,下载后按章节索引即可找到相应的代码,强烈建议运行每个源代码实例,将源代码看成本书的一部分。

时间: 2024-10-03 10:28:40

《Java数字图像处理:编程技巧与应用实践》——1.2 Java 2D API的相关文章

《Java数字图像处理:编程技巧与应用实践》——导读

前 言 为什么要写这本书 我对图像处理的认识最初来自于读软件工程专业时做毕业设计论文的需要,毕业论文做完以后,我便把所有关于图像处理的知识扔到了一边.2011年的一天有位朋友问了我几个简单的图像处理方面的问题,在解答问题的过程中我发现自己对图像处理的热情一直都在燃烧,从那一刻起我决定重新学习图像处理.这之后,我把以前买的几本图像处理的书都读了一遍,同时还坚持通过写博客来督促自己加深理解,随着学习的不断深入,对图像处理的认知也在不断加深,我越来越渴望自己能实现那些书中提到的图像处理手段与方法,于是

《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示

第3章 基本Swing UI组件与图像显示 上一章介绍了BufferedImageOp的一些重要知识,实现了几个常见的图像特效,本章介绍如何通过Swing UI组件显示与刷新图像.首先会介绍JAVA Swing的顶层组件JFrame,然后介绍Swing中最重要和使用频率最高的组件JPanel,教会读者重写JComponent中的paintComponent()方法来实现图像的显示,最后会介绍Swing组件JButton捕获与监听用户行为时最重要的ActionListener接口的使用,以及在Sw

《Java数字图像处理:编程技巧与应用实践》——2.4 小结

2.4 小结 本章重点介绍了Java 2D中关于图像方面的操作接口类BufferedImageOp,通过其实现类可以很方便地实现图像的色彩空间转换,自定义颜色查找表,卷积功能(包括边缘提取.线性模糊.高斯模糊),图像的放大与缩小.错切变化.平移变换.旋转变换等.最后本章通过编码实现了几种简单而且常见的图像处理功能,帮助读者加深对BufferedImageOp接口的认识.如果你还想更加深入地了解BufferedImageOp接口实现类的使用,请参照JDK官方文档说明,同时建议你多多编程实践,只有加

《Java数字图像处理:编程技巧与应用实践》——2.3 基于BufferedImageOp的图像滤镜演示

2.3 基于BufferedImageOp的图像滤镜演示 通过前面两节的学习,我们已经大致了解BufferedImageOp接口及其实现类的功能.实践出真知,本节将演示BufferedImageOp接口中每个实现类的实际使用场景,达到知行合一.学以致用的目的,帮助大家解决项目中遇到的实际问题.为了让大家对应用效果有更加深刻的印象,下面会使用BufferedImageOp的实现类来实现如下几个滤镜特效功能. 黑白滤镜:将彩色图像自动转换为黑白两色图像. 灰度滤镜:将彩色图像自动转换为灰度图像. 模

《Java数字图像处理:编程技巧与应用实践》——第1章 Java Graphics及其API简介 1.1 什么是Java图形设备Graphics

第1章 Java Graphics及其API简介 在开始本书内容之前,笔者假设你已经有了面向对象语言编程的基本概念,了解Java语言的基本语法与特征,原因在于本书的所有源代码都是基于Java语言实现的,而且是基于Java开发环境运行与演示所有图像处理算法的.本书第1章到第3章是为了帮助读者了解与掌握Java 图形与GUI编程的基本知识与概念而写的.本章主要介绍Java GUI编程中基本的图形知识,针对GUI编程,Java语言提供了两套几乎并行的API,分别是Swing与AWT.早期的Java G

《Java数字图像处理:编程技巧与应用实践》——3.6 小结

3.6 小结 本章一步一步地剖析如何了构建一个Swing UI程序,介绍了JPanel.JButton.JFile-Chooser等组件的用法,最后通过JFrame组件组合成为用户交互界面,实现了对图像文件的显示与操作,以及UI响应用户的操作与刷新.这也是本书后面多数章节中要用到的测试UI,所以学习与掌握本章知识,将为后面图像处理的代码提供一个UI现实与效果演示界面,帮助读者加深对知识的理解.前面三章已经介绍了Java图像处理API基础知识与Swing的基础知识,这为后面学习图像处理做了很好的铺

《Java数字图像处理:编程技巧与应用实践》——第2章 Java BufferedImage对象及其支持的API操作 2.1 BufferedImage对象的构成

第2章 Java BufferedImage对象及其支持的API操作 第1章我们一起学习了Java中的Graphics图形包基本概念与知识,本章将介绍Java中关于图像文件操作的基本知识.首先是Java 2D图像对象BufferedImage的组件构成.与图像文件之间的关系.格式支持,以及如何利用BufferedImage对象在Java语言中实现像素读写操作.然后通过BufferedImageOp接口介绍Java中几种非常有用的对像素操作的Buffered-ImageOp的实现类.最后将集合上述

《Java数字图像处理:编程技巧与应用实践》——1.3 用Java Swing绘制自定义的JPanel

1.3 用Java Swing绘制自定义的JPanel Swing的JPanel组件是GUI编程中最重要的面板组件,可以通过重写JPanel中paint-Component方法实现对JPanel面板组件的背景颜色的调整或添加背景图片,进而实现自定义版本的面板(JPanel)组件.只要完成如下几步就可以实现一个简单自定义JPanel面板的绘制. 1)实现对JPanel面板的继承,代码如下: public class CustomJPanel extends JPanel { // 更多代码 } 2

《Java数字图像处理:编程技巧与应用实践》——3.4 基本JButton事件响应

3.4 基本JButton事件响应 在学习JButton事件响应的知识之前,首先来看一下Swing中如何实现对用户事件的监听与处理,认识一下Swing中事件响应最重要的线程-事件分派线程. 在Swing中有一个特殊的线程被称为Swing事件分配线程,如果对UI组件的操作不在Swing事件分派线程中,Swing将抛出异常.检测当前线程是否为事件分派线程可以通过Swing本身提供的一个简单方法SwingUtilities.isEventDispatchThread()来完成.对Swing UI组件的