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

简介:

本节书摘来自华章计算机《Java数字图像处理:编程技巧与应用实践》一书中的第1章,第1.2节,作者 贾志刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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所示。

screenshot

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所示。

screenshot

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

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,下载后按章节索引即可找到相应的代码,强烈建议运行每个源代码实例,将源代码看成本书的一部分。

相关文章
|
3天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
26 7
|
3天前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
9 0
|
1天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。
|
2天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
12 5
|
2天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
2天前
|
安全 Java API
Java进阶-Java Stream API详解与使用
效、更易于维护的代码,同时享受到函数式编程带来的好处。
12 2
|
2天前
|
安全 Java 开发者
Java中的多线程编程:理解与实践
【5月更文挑战第18天】在现代软件开发中,多线程编程是提高程序性能和响应速度的重要手段。Java作为一种广泛使用的编程语言,其内置的多线程支持使得开发者能够轻松地实现并行处理。本文将深入探讨Java多线程的基本概念、实现方式以及常见的并发问题,并通过实例代码演示如何高效地使用多线程技术。通过阅读本文,读者将对Java多线程编程有一个全面的认识,并能够在实际开发中灵活运用。
|
3天前
|
Java 关系型数据库 MySQL
Java技术探索中的实践与思考
Java的跨平台、自动内存管理和丰富的类库使其备受欢迎。通过构建一个使用Spring Boot、MySQL和Thymeleaf的简易博客系统,展示了Java技术栈的应用。实践中,强调了技术选型、面向对象设计、安全性、性能优化和持续学习的重要性。
|
3天前
|
Java 大数据 API
利用Java Stream API实现高效数据处理
在大数据和云计算时代,数据处理效率成为了软件开发者必须面对的重要挑战。Java 8及以后版本引入的Stream API为开发者提供了一种声明式、函数式的数据处理方式,极大提升了数据处理的效率和可读性。本文将详细介绍Java Stream API的基本概念、使用方法和性能优势,并通过实际案例展示如何在实际项目中应用Stream API实现高效数据处理。
|
4天前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理

热门文章

最新文章