Java图像编程之:Graphics

news2024/11/17 5:43:48

一、概念介绍

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.coloradmin.cn/o/1200744.html

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

相关文章

.net在使用存储过程中IN参数的拼接方案,使用Join()方法

有时候拼接SQL语句时&#xff0c;可能会需要将list中的元素都加上单引号&#xff0c;并以逗号分开&#xff0c;但是Join只能简单的分开&#xff0c;没有有单引号&#xff01; 1.第一种拼接方案 List<string> arrIds new List<string>(); arrIds.Add("aa&qu…

微软近日限制员工访问ChatGPT!

作者 | 撒鸿宇 据CNBC报道&#xff0c;在这周四的短时间内&#xff0c;微软的员工被禁止使用ChatGPT。 微软在其内部网站的更新中表示&#xff1a;“由于安全和数据问题&#xff0c;一些AI工具不再对员工开放。”据CNBC查证&#xff0c;他们看到了一张截图&#xff0c;该截图显…

[Go语言]SSTI从0到1

[Go语言]SSTI从0到1 1.Go-web基础及示例2.参数处理3.模版引擎3.1 text/template3.2 SSTI 4.[LineCTF2022]gotm1.题目源码2.WP 1.Go-web基础及示例 package main import ("fmt""net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { // 定…

发布订阅者模式(观察者模式)

目录 应用场景 1.结构 2.效果 3.代码 3.1.Main方法的类【ObserverPatternExample】 3.2.主题&#xff08;接口&#xff09;【Subject】 3.3.观察者&#xff08;接口&#xff09;【Observer】 3.4.主题&#xff08;实现类&#xff09;【ConcreteSubject】 3.5.观察者&a…

[工业自动化-16]:西门子S7-15xxx编程 - 软件编程 - 西门子仿真软件PLCSIM

目录 前言&#xff1a; 一、PLCSIM仿真软件 1.1 PLCSIM仿真软件基础版&#xff08;内嵌&#xff09; 1.2 PLCSIM仿真软件与PLCSIM仿真软件高级版的区别&#xff1f; 1.3 PLCSIM使用 前言&#xff1a; PLC集成开发环境是运行在Host主机上&#xff0c;Host主机与PLC可以通过…

外星人笔记本键盘USB协议逆向

前言 我朋友一台 dell g16 购买时直接安装了linux系统&#xff0c;但是linux上没有官方的键盘控制中心&#xff0c;所以无法控制键盘灯光&#xff0c;于是我就想着能不能逆向一下键盘的协议&#xff0c;然后自己写一个控制键盘灯光的程序。我自己的外星人笔记本是m16&#xff…

基恩士软件的基本指令(二)

目录 基础指令 输入输出常开常闭指令 “A软元件名称--装入快捷键” “O软元件名称--输出快捷键” “ALT回车--连线快捷键” “B软元件--常闭接点” “软元件“/”--切换常开/常闭接点状态” 上升沿下降沿指令 “P-软元件回车--上升沿输入方法” “F-软元件回车--下降沿输入…

logback异步日志打印阻塞工作线程

前言 最新做项目&#xff0c;发现一些历史遗留问题&#xff0c;典型的是日志打印的配置问题&#xff0c;其实都是些简单问题&#xff0c;但是往往简单问题引起严重的事故&#xff0c;比如日志打印阻塞工作线程&#xff0c;以logback和log4j2为例。logback实际上是springboot的…

通过SD卡给某摄像头植入可控程序

0x01. 摄像头卡刷初体验 最近研究了手上一台摄像头的sd卡刷机功能&#xff0c;该摄像头只支持fat32格式的sd卡&#xff0c;所以需要先把sd卡格式化为fat32&#xff0c;另外微软把fat32限制了最大容量32G&#xff0c;所以也只能用不大于32G的sd卡来刷机。 这里使用32G的sd卡来…

flutter逆向 ACTF native app

前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…

RGMII回环:IDDR+ODDR+差分接口

目录 一、实验内容二、原理解释三、程序1、顶层文件&#xff1a;2、子模块2.1 oddr模块2.2、iddr顶层模块2.3、iddr子模块 3、仿真4、注意5、下载工程及仿真 一、实验内容 1、通过IDDR和ODDR的方式完成RGMII协议&#xff1b; 2、外部接口使用OBUFDS、IBUFDS转换成差分接口&…

C++语言的广泛应用领域

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

如何确定线程栈的基址?

起 很早之前&#xff0c;我遇到过几个与栈相关的问题&#xff0c;当时总结过几篇关于线程栈的文章&#xff0c;分别是 《栈大小可以怎么改&#xff1f;》、《栈局部变量优化探究&#xff0c;意外发现了 vs 的一个 bug &#xff1f;》、《栈又溢出了》、《有趣的异常》。在这几…

【fast2021论文导读】 Learning Cache Replacement with Cacheus

文章:Learning Cache Replacement with Cacheus 导读摘要: 机器学习的最新进展为解决计算系统中的经典问题开辟了新的、有吸引力的方法。对于存储系统,缓存替换是一个这样的问题,因为它对性能有巨大的影响。 本文第一个贡献,确定了与缓存相关的特征,特别是,四种工作负载…

C++基础(2)——类和对象

目录 1. 类的引入&#xff1a; 2. 类的定义&#xff1a; 2.1类的定义以及基本结构&#xff1a; 2.2 类的访问限定符&#xff1a; 3. 类的声明与定义的分离&#xff1a; 4. 类的实例化&#xff1a; 5. 类的大小计算&#xff1a; 1. 类的引入&#xff1a; 在数据结构系列的…

有源RS低通滤波

常用的滤波电路有无源滤波和有源滤波两大类。若滤波电路元件仅由无源元件&#xff08;电阻、电容、电感&#xff09;组成&#xff0c;则称为无源滤波电路。无源滤波的主要形式有电容滤波、电感滤波和复式滤波(包括倒L型、LC滤波、LCπ型滤波和RCπ型滤波等)。若滤波电路不仅有无…

【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传

一. 先看效果演示 二. 图片上传 用的el-upload加el-image组件 html部分 <el-dialog> ...//无关代码已省略<div v-for"item in imgArr" :key"item.index"><span>{{ item.name }}</span><el-upload action"#" list-t…

【408】计算机学科专业基础 - 数据结构

数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据&#xff1a; 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…

K8S知识点(十)

&#xff08;1&#xff09;Pod详解-启动命令 创建Pod&#xff0c;里面的两个容器都正常运行 &#xff08;2&#xff09;Pod详解-环境变量 &#xff08;3&#xff09;Pod详解-端口设置 &#xff08;4&#xff09;Pod详解-资源配额 修改&#xff1a;memory 不满足条件是不能正常…

揭秘:车企如何利用5R模式在数位行销领域取得突破

01 车企进入“大逃杀”时间 汽车行业一边是出口“捷报频传”&#xff0c;一边是内销“压力山大”。 内销的难&#xff0c;在之前中部某省的政府“骨折价”补贴掀起的“价格战”中已经可见一斑。这一颇具标志性的事件反映了汽车行业&#xff0c;尤其是燃油车行业正处在巨大的转…