《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设置都会起作用,因此有些属性可能只有在某些特定的平台才支持。但是最常见的图形与文本的反锯齿功能几乎所有的操作系统平台都支持!

相关文章
|
5天前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
5天前
|
JSON API 数据格式
淘宝商品评论API接口系列的应用与数据解析
在电商平台中,用户评论是了解商品质量、服务水平和用户满意度的重要数据来源。淘宝作为中国最大的电商平台,提供了商品评论API接口,帮助开发者获取和分析用户评价数据。本文将介绍淘宝商品评论API接口系列的作用、使用方法,并通过示例展示如何调用API并解析返回的JSON数据。
|
6天前
|
JSON API 开发者
1688 快递费用 API 接口的技术剖析与应用
1688快递费用API接口为企业和开发者提供自动化、高效化的快递费用查询服务,打破人工查询的繁琐局面。通过输入寄件与收件地址、商品重量、体积及选择快递公司等信息,接口精准计算费用并返回结果,支持中通、圆通等主流快递。输出内容包括快递费用、预估时效及附加费说明,助力电商精细化运营。Python示例代码展示了如何使用requests库发起POST请求并解析响应数据,实现费用查询自动化。
41 10
|
6天前
|
Java Linux API
课时3:Java简介(Java主要特点)
本文介绍了Java的主要特点及其运行机制。Java结合了编译型和解释型语言的优点,通过Java虚拟机(JVM)实现跨平台移植,简化了不同操作系统间的开发流程。Java的特点包括可移植性、简单易用、支持多线程编程、自动垃圾收集和面向对象编程。随着硬件技术的发展,Java的性能问题已大大改善,成为行业标准之一,广泛应用于各种商用平台开发。
|
6天前
|
开发框架 移动开发 Java
课时2:Java简介(Java发展概述)
课时2:Java简介(Java发展概述) 摘要: 1. Java基础知识:介绍Java作为编程语言及其思想。 2. Java的发展历史:从1991年GREEN项目到1995年正式推出,历经网景公司、HotJava浏览器等关键节点。 3. Java的版本信息:涵盖从JDK 1.0到JDK 1.8的主要版本及特性,如Lambda表达式和模块化支持。
|
6天前
|
安全 小程序 API
【03】支付宝支付商户申请下户到配置完整流程-对签约申请已通过商户进行开通API支付-创建应用-申请支付宝公钥-应用公钥-支付宝密钥-配合支付宝官方证书生成工具+配置完整流程-优雅草卓伊凡
【03】支付宝支付商户申请下户到配置完整流程-对签约申请已通过商户进行开通API支付-创建应用-申请支付宝公钥-应用公钥-支付宝密钥-配合支付宝官方证书生成工具+配置完整流程-优雅草卓伊凡
46 0
【03】支付宝支付商户申请下户到配置完整流程-对签约申请已通过商户进行开通API支付-创建应用-申请支付宝公钥-应用公钥-支付宝密钥-配合支付宝官方证书生成工具+配置完整流程-优雅草卓伊凡
|
6天前
|
存储 Java C语言
课时11:Java数据类型简介
本文介绍了Java中的数据类型划分,主要分为基本数据类型和引用数据类型。基本数据类型包括数值型(整型、浮点型)、布尔型和字符型,每种类型有固定的默认值和存储范围。引用数据类型涉及内存使用,如数组、类和接口,默认值为Null。文中还提供了不同类型的选择原则,帮助开发者在实际编程中合理选用数据类型。
|
6天前
|
存储 自然语言处理 监控
深度解析淘宝商品评论API接口:技术实现与应用实践
淘宝商品评论API接口是电商数据驱动的核心工具,帮助开发者高效获取用户评价、画像及市场趋势。其核心功能包括多维度信息采集、筛选排序、动态更新、OAuth 2.0认证和兼容多种请求方式。通过该接口,开发者可进行商品优化、竞品分析、舆情监控等。本文详细解析其技术原理、实战应用及挑战应对策略,助力开启数据驱动的电商运营新篇章。
|
6天前
|
Oracle Java Unix
课时1:认识Java(Java发展简介)
课时1:认识Java(Java发展简介)。主讲人李兴华介绍了Java的起源、发展历程及其广泛应用。Java由Sun公司开发,最初为嵌入式系统设计,后演变为三大方向:Java SE、Java ME和Java EE。尽管面临版权争议等挑战,Java仍是最流行的编程语言之一,广泛应用于大型企业及互联网平台开发。
|
8天前
|
存储 缓存 API
类似ComfyUI和Midjourney这样的文生图图生图应用的API与服务架构该怎么设计
文生图图生图应用的API与服务架构分析。或和微服务类似,但是不同。ComfyUI其 API 架构设计为我们理解此类应用提供了很好的参考模型。但距离生产级别的应用差距还有很远。
35 0

热门文章

最新文章