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

简介:

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

第1章

Java Graphics及其API简介

在开始本书内容之前,笔者假设你已经有了面向对象语言编程的基本概念,了解Java语言的基本语法与特征,原因在于本书的所有源代码都是基于Java语言实现的,而且是基于Java开发环境运行与演示所有图像处理算法的。本书第1章到第3章是为了帮助读者了解与掌握Java 图形与GUI编程的基本知识与概念而写的。本章主要介绍Java GUI编程中基本的图形知识,针对GUI编程,Java语言提供了两套几乎并行的API,分别是Swing与AWT。早期的Java GUI编程中主要使用AWT的相关组件,但是AWT的功能并不是十分强大,而且严重依赖本地接口。于是在Java 1.3及后续版本中引入了Swing工具实现GUI编程,Swing中的组件大多数都是基于纯Java语言实现的,而不是通过本地组件实现的,所以它们是轻量级的GUI组件,同时Swing对图形与图像的支持操作也有很大的提高与增强。如何区分AWT组件与Swing组件?一个简单而且相当直观的方法是看Class的名称,Swing的组件大多数带有大写的前缀字母J。

Graphics作为Java的图形引擎绘制接口,几何形状、文字、图像的绘制都必须通过它完成,此外,Graphics还支持绘制过程的控制,可以设置画笔颜色、纹理、颜色填充方法、合成与裁剪路径及各种Stroke与Fill的属性等。用户程序通常都是通过Graphics来访问绘制引擎,从而实现各种图形与图像绘制的,因此可以说Graphics是Swing中最重要的接口对象。好吧,下面让我们一起揭开Graphics的神秘面纱。

1.1 什么是Java图形设备Graphics

简单地说Graphics是Java图形绘制引擎的访问接口,只有通过它才可以访问到Java GUI的图形绘制引擎,实现图形的绘制与绘制过程的控制。

1.1.1 Graphics概述

Grahpics的功能大致可以分为两类,第一类是通过Draw或Fill方法来实现各种图形的绘制与填充,第二类是设置各种绘制属性,最简单的包括设置字体、颜色、填充方法等。此外,在Java 2D中Graphics还可以被转型为Graphics2D对象,从而提供更高精度的图形绘制,设置更多绘制属性来控制绘制过程。

1.1.2 Graphics图形设备的获取、使用和销毁

在Java Swing中正确获取Graphics对象的方法有两种。

第一种是从BufferedImage对象实例中获取,其代码如下:

screenshot

第二种方法是通过重载Swing组件的paintComponent(Graphics g)或paint(Graphics g)方法来实现,个人推荐采用重载paintComponent(Graphics g)方法来实现,因为重载paint(Graphics g)是AWT时代遗留下来的产物,是一个重量级绘制重载,通常用于Canvas对象的重载绘制。

除了以上两种推荐的做法以外,笔者经常还看到直接通过Swing组件的getGraphics去获取Graphics对象的,这样做的坏处是一旦该组件没有被显示,所对应的Graphics对象将返回NULL。而且这种做法常会导致一些意想不到的错误,所以应该尽量避免这么做。下面提供一个这么做导致错误的代码示例,如下:

JButton okBtn = new JButton(“OK”);
okBtn.getGraphics().drawRect(0,0,20,20); // NullPointerException

在获取了Java图形设备对象Graphics之后,就可以调用它的绘制方法来实现图形绘制与填充了。简单的示例代码如下:

public void paintComponent(Graphics g)
{
    g.setColor(Color.BLUE);
    g.drawRect(10, 10, 50, 50);
}

上述代码将会绘制一个蓝色边框的矩形,其中“10,10”表示矩形开始绘制的左上角位置,“50,50”分别代表矩形的长度与高度。

在使用完Graphics对象以后,请记得一定要销毁图形设备对象,可通过调用方法dispose()来释放图形绘制时所使用的任何资源。特别是当图形设备是从你自己的Buffered-Image对象中创建出来的时候,记得使用完以后一定要调用dispose()方法来释放资源。假设没有调用dispose(),一般情况下Java的GC也会自动调用来释放资源,但还是强烈建议在绘制完成以后显式调用dispose()方法来确保被使用的资源得到及时释放而不是依赖Java GC。原因在于当你使用的Graphics来自BufferedImage对象时,Graphics对象不会被自动销毁,而依赖GC调用来清理与释放资源并不能保证及时释放,可能导致程序堆内存过度消耗产生OOM(Out of Memory)问题。

1.1.3 Java Swing Graphics2D的重要属性

Graphics可以向下转型为Graphics2D对象,可以通过设置绘制属性来实现对图形绘制质量的控制。其接受对象为RenderingHints的枚举类型,通过方法setRenderingHint(Rendering-Hints.key, RenderingHints.value)来实现,一般常用的Key与Value有如下形式。

控制图形边缘反锯齿时,RenderingHints.KEY_ANTIALIASING的值为:

RenderingHints.VALUE_ANTIALIAS_ON表示支持边缘反锯齿。

RenderingHints.VALUE_ANTIALIAS_OFF表示不支持边缘反锯齿。

控制文字或文本边缘反锯齿时,RenderingHints.KEY_TEXT_ANTIALIASING的值为:

RenderingHints.VALUE_ TEXT_ANTIALIAS_ON表示支持文本边缘反锯齿。

RenderingHints.VALUE_ TEXT_ANTIALIAS_OFF表示不支持文本边缘反锯齿。

控制图像的插值方法时,KEY_INTERPOLATION的值为:

RenderingHints.VALUE_INTERPOLATION_BICUBIC表示使用双立方插值方法。

RenderingHints.VALUE_ INTERPOLATION_BILINEAR表示使用双线性插值方法。

RenderingHints.VALUE_ INTERPOLATION_NEAREST_NEIGHBOR表示使用临近点插值方法。

控制绘制方法时,KEY_RENDERING的值为:

RenderingHints.VALUE_ RENDER_QUALITY表示支持绘制质量优先。

RenderingHints.VALUE_ RENDER_SPEED表示支持绘制速度优先。

控制绘制过程是否支持抖动时,KEY_DITHERING的值为:

RenderingHints.VALUE_ DITHER_DISABLE表示不支持抖动。

RenderingHints.VALUE_ DITHER_ENABLE表示支持抖动。

更多的绘制属性控制可以参考官方文档,需要强调的是,由于Java的跨平台属性导致并不是所有的RenderingHints设置都会起作用,因此有些属性可能只有在某些特定的平台才支持。但是最常见的图形与文本的反锯齿功能几乎所有的操作系统平台都支持!

相关文章
|
13天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
18天前
|
存储 Java 关系型数据库
实验室设备管理系统【GUI/Swing+MySQL】(Java课设)
实验室设备管理系统【GUI/Swing+MySQL】(Java课设)
16 0
|
14天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
10天前
|
Java 数据挖掘
java实践
【4月更文挑战第9天】java实践
12 1
|
26天前
|
人工智能 关系型数据库 Serverless
Serverless 应用引擎常见问题之API生成的函数镜像改为自定义的镜像如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
37 3
|
2天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
4天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
7天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
35 1
|
11天前
|
Java API UED
Java中的多线程并发编程实践
【4月更文挑战第7天】在现代软件开发中,多线程技术是提高程序性能和响应速度的重要手段。Java语言提供了丰富的多线程支持,包括线程的创建、管理和同步机制。本文将深入探讨Java多线程的基本概念、实现方式以及常见的并发问题,并通过实例代码演示如何高效地利用多线程技术。
10 1