Java图像编程之:Graphics

一、概念介绍

1、Java图像编程的核心类

Java图像编程的核心类包括:

  1. BufferedImage:用于表示图像的类,可以进行像素级的操作。
  2. Image:表示图像的抽象类,是所有图像类的基类。
  3. ImageIcon:用于显示图像的类,可以将图像嵌入到Swing组件中。
  4. ImageIO:用于读取和写入图像文件的类。
  5. Graphics:用于进行图像绘制操作的抽象类,可以绘制直线、矩形、椭圆等图形。
  6. Graphics2D:继承自Graphics类,提供了更多的绘制方法和功能,可以进行更高级的图像绘制操作。
  7. Color:用于表示颜色的类,可以设置图像的颜色。
  8. Font:用于表示字体的类,可以设置图像的字体样式。

这些类是Java图像编程中常用的核心类,可以帮助你进行图像的处理、显示和绘制操作。

2、Graphics简介

java.awt.Graphics提供了绘制图形和图像的功能。它是Abstract Window Toolkit(AWT)的一部分,用于创建基于图形的用户界面。

通过使用Graphics类,您可以在屏幕上绘制直线、矩形、椭圆、多边形等基本形状,并填充它们的颜色。您还可以绘制图像、文本和其他复杂的图形。

要使用Graphics类,您需要获取一个Graphics对象。您可以通过调用组件的getGraphics()方法来获取该对象,例如JPanel、JFrame、BufferedImage。然后,您可以使用Graphics对象的各种方法来绘制您想要的图形。

除了绘制图形,Graphics类还提供了其他一些方法,如设置颜色、字体和渲染提示等。

3、Graphics主要方法

方法名描述
void clearRect(int x, int y, int width, int height)清除指定矩形区域的像素
void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)绘制一个圆弧
void drawImage(Image img, int x, int y, ImageObserver observer)在指定位置绘制指定的图像
void drawLine(int x1, int y1, int x2, int y2)绘制一条直线
void drawOval(int x, int y, int width, int height)绘制一个椭圆
void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)绘制一个多边形
void drawRect(int x, int y, int width, int height)绘制一个矩形
void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)绘制一个圆角矩形
void drawString(String str, int x, int y)在指定位置绘制给定字符串
void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)填充一个圆弧
void fillOval(int x, int y, int width, int height)填充一个椭圆
void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)填充一个多边形
void fillRect(int x, int y, int width, int height)填充一个矩形
void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)填充一个圆角矩形
Color getColor()返回当前颜色
Font getFont()返回当前字体
void setColor(Color c)设置颜色
void setFont(Font font)设置字体

这些是Graphics类中最常用的一些方法,可以用于绘制基本形状、图像和文本,并设置颜色和字体等属性。

二、代码示例

以下通过示例代码,演示几个主要的方法使用。

注意:原点坐标是左上角,x轴向右增加,y轴向下增加

1、常用方法演示

ImageUtil工具类

public class ImageUtil {public static BufferedImage createImage() {int imageWidth = 500;int imageHeight = 500;return new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB);}/*** 将图片保存到指定位置*/public static void saveImage2File(BufferedImage image, String fileLocation, String fileName) {try {File file = new File(fileLocation);if (!file.exists()) {file.mkdir();}FileOutputStream fos = new FileOutputStream(fileLocation + fileName);BufferedOutputStream bos = new BufferedOutputStream(fos);ImageIO.write(image, "png", fos);bos.close();} catch (Exception e) {e.printStackTrace();}}
}

使用Graphics图像工具类

    public static void test() {BufferedImage bufferedImage = ImageUtil.createImage();Graphics g = bufferedImage.getGraphics();//设置浅灰色,并绘制背景g.setColor(new Color(0XEEEEEE));g.fillRect(0,0,500,500);//设置颜色g.setColor(Color.pink);//填充圆形// x、y 绘制的左上角坐标,width、height 椭圆的宽、高,如果宽高一致就是圆型g.fillOval(10, 50, 100, 100);//设置颜色g.setColor(Color.ORANGE);// 绘制矩形// x、y 绘制的左上角坐标,width、height 矩形的宽、高g.drawRect(50, 20, 100, 100);// 填充绘制圆角矩形// x、y 绘制的左上角坐标,width、height 矩形的宽、高// arcWidth–四个角处圆弧的水平直径,arcHeight–四个角处圆弧的垂直直径。g.fillRoundRect(50, 180, 100, 100,20,20);//设置颜色g.setColor(Color.RED);// 绘制圆弧// x、y 绘制的左上角坐标,width、height 宽、高,startAngle 开始的角度,arcAngle 绘制的总角度,绘制角度从右到左计算g.drawArc(10, 300, 100, 100, 30, 180);//设置颜色g.setColor(Color.BLUE);// 填充绘制多边形// xPoints、yPoints x轴和y轴的坐标数组,分别一一对应组成数个点,nPoints 要绘制的点数int[] xPoints = new int[]{200, 300, 400, 300};int[] yPoints = new int[]{110, 210, 110, 10};int nPoints = 4;g.fillPolygon(xPoints, yPoints, nPoints);//设置颜色g.setColor(Color.YELLOW);// 填充3d矩形g.fill3DRect(300, 300, 100, 100, true);//画一个线框//设置颜色g.setColor(Color.DARK_GRAY);// 设置字体Font font = new Font("微软雅黑", Font.BOLD, 38);g.setFont(font);// 写文字g.drawString("写第一标题", 10, 450);ImageUtil.saveImage2File(bufferedImage, "d:/temp/image/", "g01.png");}

在这里插入图片描述

2、设置裁剪区域

    public static void test0() {BufferedImage bufferedImage = ImageUtil.createImage();Graphics g = bufferedImage.getGraphics();//设置浅灰色,并绘制背景g.setColor(new Color(0XEEEEEE));g.fillRect(0,0,500,500);//设置颜色g.setColor(Color.pink);//填充圆形g.fillOval(20, 20, 100, 100);//设置颜色g.setColor(Color.CYAN);//设置裁剪区域,设置以后,后续的所有绘制都只会在此区域内有效g.setClip(100, 100, 200, 200);// 在裁剪区域填充圆型g.fillOval(150, 150, 200, 200);ImageUtil.saveImage2File(bufferedImage, "d:/temp/image/", "g00.png");}

在这里插入图片描述

3、原点坐标转换

    public static void test2() {BufferedImage bufferedImage = ImageUtil.createImage();Graphics g = bufferedImage.getGraphics();//设置浅灰色,并绘制背景g.setColor(new Color(0XEEEEEE));g.fillRect(0,0,500,500);//设置颜色g.setColor(Color.pink);//重新设置坐标原点,新绘制的图形将以此坐标作为原点g.translate(-100, -100);//填充圆形,原本应该在中间,经上述转换后,向左上角移动了g.fillRect(200, 200, 100, 100);ImageUtil.saveImage2File(bufferedImage, "d:/temp/image/", "g03.png");}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat:用于各种音视频[封装…

敏捷开发是什么?敏捷开发流程是怎么样的?

1. 什么是敏捷开发? 敏捷开发是一种迭代、增量式的软件开发方法,旨在通过灵活、协作和快速响应变化的方式,提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型,敏捷开发更加注重用户需求的响应和团队协作&#xff0…

tomcat+idea--如何在idea上发布项目

对应于idea2022以后的版本 (一)如何配置idea上的tomcat? 1、新建一个项目,左上角File,new,project,新建后就和普通的java项目一样。 2、然后点击项目名,右键选择“Add framework s…

JUL日志

文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假…

汽车ECU的虚拟化技术初探(二)

目录 1.概述 2.U2A虚拟化方案概述 3.U2A的虚拟化功能概述 4.虚拟化辅助功能的使能 5.留坑 1.概述 在汽车ECU的虚拟化技术初探(一)-CSDN博客里,我们聊到虚拟化技术比较关键的就是vECU的虚拟地址翻译问题,例如Cortex-A77就使用MMU来进行虚实地址的转换…

C语言——贪吃蛇

一. 游戏效果 贪吃蛇 二. 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 贪吃蛇起源于1977年的投币式墙壁游戏《Blockade》,后移植到各种平台上。具体如下: 起源。1977年,投币式…

KDE Plasma 6 将不支持较旧的桌面小部件

KDE Plasma 6 进行了一些修改,需要小部件作者进行调整。开发人员,移植时间到了! KDE Plasma 6 是备受期待的桌面环境版本升级版本。 最近,其发布时间表公布,第一个 Alpha 版本将于 2023 年 11 月 8 日上线&#xff0…

Elasticsearch概述

Elasticsearch(ES)是一个基于Lucene库构建的开源搜索引擎。它提供了一个分布式、多租户的全文搜索引擎,具有RESTful Web界面。Elasticsearch的主要特点包括: 分布式搜索引擎: Elasticsearch被设计为一个分布式系统&…

SpringCloud——负载均衡——OpenFeign

Feign是一个声明式的客户端接口,相比RestTemplate,更好的简化了微服务之间的调用方式。而且Feign默认集成了Ribbon,可以实现负载均衡。 1.OpenFeign与Feign OpenFeign在Feign的基础上支持SpringMVC的注解。OpenFeign的FeignClient可以解析Re…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS? 一、NestJS特性?二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS? Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

HuggingFace模型头的自定义

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 在本文中我们将介绍如何使HuggingFace的模型适应你的任务,在Pytorch中建立自定义模型头并将其连接到HF模型的主体&#…

Web相机和浏览器的二维码扫描方案

Web相机和适用于浏览器的二维码扫描方案 qr-camera 在线体验 | English 功能 支持浏览器扫描二维码支持拍照支持录像功能支持二维码解析和生成 quickstart npm i qr-cameraimport {QRCamera} from qr-camera;function main(){const camera new QRCamera();document.body…

编写http接口api及接口自动化测试

片言 此文中代码都是笔者工作中源码,所以不会很完整,主要摘常见场景的api片段用以举例说明 另:此文主要针对自动化测试人员,尤其有python基础阅读更佳。 笔者使用 python3.6 postgresql10 flask 0.12 的环境 场景介绍 我们要实现后台…

如何导出PPT画的图为高清图片?插入到world后不压缩图像的设置方法?

期刊投稿的时候,需要图片保持一定的清晰度数,那么我们怎么才能从PPT中导出符合要求的图片呢? 对于矢量图绘图软件所画的图,直接导出即可。 而PPT导出的图片清晰度在60pi,就很模糊。 整体思路: PPT绘图——…

吃透 Spring 系列—MVC部分

目录 ◆ SpringMVC简介 - SpringMVC概述 - SpringMVC快速入门 - Controller中访问容器中的Bean - SpringMVC关键组件浅析 ◆ SpringMVC的请求处理 - 请求映射路径的配置 - 请求数据的接收 - Javaweb常用对象获取 - 请求静态资源 - 注解驱动 标签 ◆ SpringMV…

Leetcode421. 数组中两个数的最大异或值

Every day a Leetcode 题目来源:421. 数组中两个数的最大异或值 解法1:贪心 位运算 初始化答案 ans 0。从最高位 high_bit 开始枚举 i,也就是 max⁡(nums) 的二进制长度减一。设 newAns ans 2i,看能否从数组 nums 中选两个…

【ATTCK】MITRE Caldera -前瞻规划器

CALDERA是一个由python语言编写的红蓝对抗工具(攻击模拟工具)。它是MITRE公司发起的一个研究项目,该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的,能够较真实地APT攻击行为模式。 通过CALDERA工具,安全…

zookeeper应用之分布式屏障

分布式系统中某些节点任务当满足某个条件时才允许继续运行,如果不满足则当前节点需要等待。这个时候就需要一个屏障来阻止节点的处理。ZooKeeper Barrier是ZooKeeper提供的一种用于分布式环境中实现同步和协调的机制。具体逻辑就是: 1、检测某个barrier…

深入了解JVM和垃圾回收算法

1.什么是JVM? JVM是Java虚拟机(Java Virtual Machine)的缩写,是Java程序运行的核心组件。JVM是一个虚拟的计算机,它提供了一个独立的运行环境,可以在不同的操作系统上运行Java程序。 2.如何判断可回收垃圾…

机器学习数据预处理——Word2Vec的使用

引言: Word2Vec 是一种强大的词向量表示方法,通常通过训练神经网络来学习词汇中的词语嵌入。它可以捕捉词语之间的语义关系,对于许多自然语言处理任务,包括情感分析,都表现出色。 代码: 重点代码&#…