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

相关文章
|
2月前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
43 6
|
2月前
|
设计模式 Java 开发者
Java中的异常处理:理解与实践
【10月更文挑战第42天】在Java的世界中,异常处理是每个开发者必须面对的挑战。它就像是一场不可预知的风暴,可能会在任何时候突然降临,打乱我们的计划。但是,如果我们能够掌握正确的处理方法,这场风暴也可以变成推动我们前进的力量。本文将带你深入理解Java中的异常处理机制,通过代码示例,我们将一起学习如何捕获、处理和预防异常,让你的程序在面对任何挑战时都能保持稳健和优雅。
|
11天前
|
存储 API 计算机视觉
自学记录HarmonyOS Next Image API 13:图像处理与传输的开发实践
在完成数字版权管理(DRM)项目后,我决定挑战HarmonyOS Next的图像处理功能,学习Image API和SendableImage API。这两个API支持图像加载、编辑、存储及跨设备发送共享。我计划开发一个简单的图像编辑与发送工具,实现图像裁剪、缩放及跨设备共享功能。通过研究,我深刻体会到HarmonyOS的强大设计,未来这些功能可应用于照片编辑、媒体共享等场景。如果你对图像处理感兴趣,不妨一起探索更多高级特性,共同进步。
68 11
|
7天前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
119 1
|
2月前
|
Arthas 监控 Java
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
本文介绍了阿里云 Java Agent 4.x 版本在基于 OTel Java Agent 二次开发过程中的实践与思考,并重点从功能、性能、稳定性、兼容性四个方面介绍了所做的工作。同时也介绍了阿里云可观测团队积极参与开源建设取得的丰厚成果。
251 7
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
|
1月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
2月前
|
XML JSON 缓存
深入理解RESTful API设计原则与实践
在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
|
1月前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
34 5
|
1月前
|
机器学习/深度学习 搜索推荐 API
淘宝/天猫按图搜索(拍立淘)API的深度解析与应用实践
在数字化时代,电商行业迅速发展,个性化、便捷性和高效性成为消费者新需求。淘宝/天猫推出的拍立淘API,利用图像识别技术,提供精准的购物搜索体验。本文深入探讨其原理、优势、应用场景及实现方法,助力电商技术和用户体验提升。
|
2月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
177 6