第十九章Java绘图

news2024/11/16 9:22:59

9.1.1——Graphics类
Graphics类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制,Graphics类封装了Java支持的基本绘图操作所需要的状态信息,主要包括颜色,字体,画笔,文本,图像等。

Graphics 类提供了绘图常用的方法,利用这些方法可以实现直线、矩形、多边形、椭圆、圆弧等意状和文本、图片的绘制操作。另外,在执行这些操作之前,还可以使用相应的方法设置绘图的颜色和字体等状态属性。

19.1.2——Graphics2D类
使用Graphics 类可以完成简单的图形绘制任务,但是它所实现的功能非常有限,如无法改变线条
的粗细、不能对图片使用旋转和模糊等过滤效果。Graphics2D 类继承 Graphics 类,实现了功能更加强大的绘图操作的集合。由于 Graphics2D 类是Grephics 类的扩展,也是推荐使用的 Java 绘图类,所以本章主要讲解如何使用 Graphics2D 类实现Java绘图

说明
Graphics2D 是推荐使用的绘图类,但是程序设计中提供的绘图对象大多是 Graphics 类的实例对这时应该使用强制类型转换将其转换为 Graphics2D 类型
 

public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g; (//强制类型转换为 Graphics2D 类型
g2...
}

19.2——绘制图形
例题1

package shijiu;
import java.awt.*;
import javax.swing.*;
 
public class DrawCircle extends JFrame{
    private final int OVAL_WIDTH = 80;    //圆形的宽
    private final int OVAL_HEIGHT = 80;    //圆形的高
    
    public DrawCircle() {
        initialize();    //调用初始化方法
    }
    private void initialize() {    //初始化方法
        setSize(300,200);    //设置窗体大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设置窗体关闭模式
        setContentPane(new DrawPanel());//设置窗体面板为绘图面板对象
        setTitle("绘图实例1");    //设置窗体标题
    }
    class DrawPanel extends JPanel{//创建绘图面板
        public void paint(Graphics g) {//重写绘制方法
            g.drawOval(10,10, OVAL_WIDTH, OVAL_HEIGHT);
            g.drawOval(80,10, OVAL_WIDTH, OVAL_HEIGHT);
            g.drawOval(150,10, OVAL_WIDTH, OVAL_HEIGHT);
            g.drawOval(50,70, OVAL_WIDTH, OVAL_HEIGHT);
            g.drawOval(120,70, OVAL_WIDTH, OVAL_HEIGHT);
        }
    }
    public static void main(String[] args) {
        new DrawCircle().setVisible(true);
    }
}

 

19.3——绘制颜色与画笔属性
Java语言使用color类封装颜色的各种属性,并对颜色进行管理。另外,在绘制图形时还可以指定线的粗细和虚实等画笔属性

19.3.1——设置颜色
使用 Color 类可以创建任意颜色的对象,不用担心平台是否支持该颜色,因为 Java 以跨平台和与硬件无关的方式支持颜色管理。创建 Color 对象的构造方法有如下两种:

Color col = new Color(int r, int g, int b)
Color col = new Color(int rgb)

D r: 该参数是三原色中红色的取值
口 g: 该参数是三原色中绿色的取值
口 b:该参数是三原色中蓝色的取值。
Color 类定义了常用色彩的常量值,如表 19.2 所示。这些常量都是静态的 Color 对象,可以直接使用这些常量值定义的颜色对象。 

19.3.2——设置画笔

默认情况下,Graphics 类使用的画笔属性是粗细为 1个像素的正方形,而 Graphics2D 类可以调setStroke0方法设置画笔的属性,如改变线条的粗细、虚实,定义线段端点的形状、风格等。语法格如下:

setStroke(Stroke stroke)
 其中,参数 stroke 是Stroke 接口的实现类对象。setStroke0方法必须接受一个 Stroke 接口的实现类对象作参数java.awt 包中提供了 BasicStroke秀它实现了 Stroke 接口,并且通过不同的构造方法创建画笔属性不同的对象。这些构造方法如下:

19.4——绘制文本

Java绘图类也可以用来绘制文本内容,且可以在绘制钱设置字体的样式、大小等。

19.4.1——设置字体

Java使用Font类封装了字体的大小,样式等属性,该类在Java.awt包中定义,其构造方法可以指定字体的名称,大小和样式语法如下

Font(String name,int style,int size)
name:字体的名字
style:字体的样式
size:字体的大小

19.4.2——显示文字

例题3及结果

19.5显示图片

绘图类不仅可以绘制图形和文本,还可以使用 drawImage0方法将图片资源显示到绘图上下文中,而且可以实现各种特效处理,如图片的缩放、翻转等。有关图像处理的知识将在 19.6 节讲解,本节主要讲解如何显示图片。语法如下:

drawimage(lmage img, int x, int y, lmageObserver observer)

该方注将img图片显示在 x、y 指定的位置上。方法中涉及的参数说明如表 19.4 所示

4

 

19.6——图像处理
开发高级的桌面应用程序,必须掌握一些图像处理与动画制作的技术,如在程序中显示统计图,销售趋势图、动态按钮等。本节将在 Java 绘图的基础上讲解图像处理技术

19.6.1——放大与缩小
在19.5节讲解显示图片时,使用了 drawImage0方法将图片以原始大小显示在窗体中,要想实现图的放大与缩小,则需要使用它的重载方法。语法如下:

drawmage(lmage img, int x, int y, int width, int height, lmageObserver observer)

例题5 

package shijiu;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
 
import shijiu.DrawString.CanvasPanel;
public class ImageZoom extends JFrame {
    Image img;
    private int imgWidth,imgHeight;
    private JSlider jSlider;
    public ImageZoom() {
        try {
            img=ImageIO.read(new File("src/shijiu/c.jpg"));//读取图片文件
        }catch (IOException e) {
            e.printStackTrace();
        }
        CanvasPanel canvas =new CanvasPanel();
        jSlider = new JSlider();
        jSlider.setMaximum(1000);
        jSlider.setValue(100);
        jSlider.setMaximum(1);
        jSlider.addChangeListener(new ChangeListener(){
            public void stateChanged(ChangeEvent e) {
                canvas.repaint();
            }
        });
        JPanel center =new JPanel();
        center.setLayout(new BorderLayout());
        center.add(jSlider,BorderLayout.SOUTH);
        center.add(canvas,BorderLayout.CENTER);
        setContentPane(center);
        setBounds(100,100,800,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("绘制图片");
    }
    class CanvasPanel extends JPanel{
        public void paint(Graphics g) {
            int newW=0,newH =0;
            imgWidth =img.getWidth(this);
            imgHeight =img.getHeight(this);
            float value =jSlider.getValue();
            newW =(int)(imgWidth*value/10);
            newH =(int)(imgHeight*value/10);
            g.drawImage(img, 0, 0, newW, newH, this );
        }    }
    public static void main(String[] args) {
        new ImageZoom().setVisible(true);
    }}

19.6.2——图像翻转
图像的翻转需要使用 drawImage0方法的另一个重载方法。语法如下:

drawimage(lmage img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, lmageObserver observer
此方法总是用非缩放的图像来呈现缩放的矩形,并动态地执行所需的缩放。此操作不使用缓存的缩放图像。执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像,以保持这些映射关系。方法中涉及的参数说明如表 19.6 所示。 

package shijiu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
 
import shijiu.DrawString.CanvasPanel;
 
import javax.imageio.*;
public class PartImage extends JFrame {
    private Image img;
    private int dx1,dy1,dx2,dy2;
    private int sx1,sy1,sx2,sy2;
    private int width=1020,height =768;
    private JButton vBtn=null;
    private JButton hBtn=null;
    private CanvasPanel canvasPanel =null;
     public PartImage() {
                try {
                    img=ImageIO.read(new File("src/shijiu/a.jpg"));//读取图片文件
                }catch (IOException e) {
                    e.printStackTrace();
                }
                dx2 =sx2 =width;
                dy2 =sy2= height;
                vBtn =new JButton("垂直");
                hBtn =new JButton("水平");
                
                JPanel bottom=new JPanel();
                bottom.add(hBtn);
                bottom.add(vBtn);
                
                Container c=getContentPane();
                c.add(bottom,BorderLayout.SOUTH);
                canvasPanel =new CanvasPanel();
                c.add(canvasPanel,BorderLayout.CENTER);
                
                addListener();
                
                setBounds(400,400,600,560);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setTitle("图片翻转");
     }
     private void addListener() {
         vBtn.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 sy1=Math.abs(sy1-height);
                 sy2=Math.abs(sy2-height);
             canvasPanel.repaint();
             }
         });
         hBtn.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 sx1=Math.abs(sx1-width);
                 sx2=Math.abs(sx2-width);
                 canvasPanel.repaint();
             }
         });
     }
     class CanvasPanel extends JPanel{
         public void paint(Graphics g) {
             g.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);//绘制指定大小
         }}
     public static void main(String[] args) {
        new PartImage().setVisible(true);
    }}

19.6.3——图像旋转
图像旋转需要调用 Graphics2D 类的 rotate0方法,该方法将根据指定的弧度旋转图像。语法如下

rotate(double theta)
说明 
其中,theta 是指旋转的弧度
说明rotate0方法只接受旋转的弧度作为参数,可以使用 Math 类的 toRadians0)方法将角度转换为弧toRadians(方法接受角度值作为参数,返回值是转换完毕的孤度值。

例题7及结果

19.6.4——图像倾斜
例题8及结果

 

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

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

相关文章

composer切换全局镜像源的方法

composer 默认配置中的镜像地址为国外的,在下载一些依赖包的时候会感觉很慢。当然国内也有很多composer镜像地址的,比如阿里云,腾讯云等。下面的博文73so博客就和大家说说,如何将composer的默认镜像改为国内镜像源的方法。 compo…

Java-认识String类

本章重点: 1. 认识 String 类 2. 了解 String 类的基本用法 3. 熟练掌握 String 类的常见操作 4. 认识字符串常量池 5. 认识 StringBuffer 和 StringBuilder 1.String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组…

Selenium自动化测试详解

最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的…

C++初阶--类型模板

文章目录 泛型编程函数模板使用通用加法函数多模板参数必须用实例化 函数模板的原理类模板使用 注意事项 泛型编程 先看一个例子: 这是一些对于Swap重载的函数,区别是类型不同; 虽然能够重载使用,但代码复用率比较低&#xff0c…

技术分享| anyRTC之RTN网络

RTN(Real-time Network)中文名:实时音视频传输网络。 RTN是最近几年由各大RTC的云厂商提出的一个全新架构的音视频实时传输网络概念。类似于直播的CDN网络,RTN是对音视频的实时性又强烈要求的场景而设计的,原理上全球端到端的时延通过RTN网络…

vue2【相关介绍】

目录 1:什么是单页面应用程序 2:什么是vue-cli 3:安装使用 4:vue项目的目录结构:​编辑 5:了解src目录的构成: 6:vue项目的运行流程 7:el:容器名称&…

01-了解微服务架构的演变过程和微服务技术栈

微服务 微服务架构演变 单体架构:将业务的所有功能集中在一个项目中开发最后打成一个包部署 优点: 架构简单, 部署成本低,适合小型项目缺点: 耦合度高, 升级维护困难 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发称为一个服务 优点: 降低服务耦合…

电脑显示msvcp140_1.dll丢失的5个常用解决方法,亲测可修复

常见于计算机操作中的"msvcp140_1.dll丢失"错误警示,往往令部分应用程序无法正常启动。为了解决这个问题,我们需要采取一些措施来修复丢失的文件。本文将介绍6个解决msvcp140_1.dll丢失的方法,帮助大家快速恢复计算机的正常运行。 …

SpatialFeaturePlot画图是空的

stmeta.datadplyr::left_join(stmeta.data,coor[,c(3,7:8)],by"barcodes") SpatialFeaturePlot(st,features "test",images "P02") 做了上述操作之后画出的图是空的 原因,left_join之后自动把stmeta.data的行名变成了1&#xff0…

算法---腐烂的橘子

题目 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格…

电机应用开发-编码器的使用

目录 编码器 增量式编码器倍频技术 常用编码器测速方法:M法、T法和M/T法 STM32的编码器接口 编码器接口结构体 减速电机编码器测速实验 硬件设计 TIM3配置编码器 测速环节 步进电机编码器测速实验 编码器 增量式编码器倍频技术 增量式编码器输出的常见脉…

STC单片机选择外部晶振烧录程序无法切换回内部晶振导致单片机不能使用

STC单片机选择外部晶振烧录程序无法切换回内部晶振导致单片机不能使用 1.概述 在学习51单片机过程中,选择了STC的12C2052AD型号单片机作为入门芯片。前几个课题实验使用默认的内部晶振烧录程序,运行都没有问题。 选择一个LED亮度渐变的课题做实验&…

【C++】构造函数详解

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Vue3 源码解读系列(九)——依赖注入

依赖注入 依赖注入用于祖先组件向后代组件传递数据。 特点: 祖先组件不需要知道哪些后代组件在使用它提供的数据。 后代组件也不需要知道注入的数据来自哪里。 /*** provide 的实现*/ function provide(key, value) {let provides currentInstance.provides // 当…

量子计算+物流!“最后一英里”配送难题Unisys成功实时决策

(图片来源:网络) 此前,供应链行业一直致力于手工操作,严重依赖于纸质系统。后来随着客户需求的不断变化,这种传统方法逐渐显出不足之处。供应链行业正在迅速转向现代化,采用自动化和数据驱动的…

【开源】基于微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

redis的一些操作

文章目录 清空当前缓存和所有缓存配置内存大小,防止内存饱满设置内存淘汰策略键过期机制 清空当前缓存和所有缓存 Windows环境下使用命令行进行redis缓存清理 redis安装目录下输入cmdredis-cli -p 端口号flushdb 清除当前数据库缓存flushall 清除整个redis所有缓存…

关于一些网络的概述

语义分割网络是一种基于深度学习的计算机视觉技术,它能够将图像中的每个像素分配给特定的类别,从而实现对图像中不同对象的精确识别和定位。近年来,随着深度学习技术的不断发展,语义分割网络在各个领域都取得了显著的进展。 早期的语义分割网络主要采用全卷积神经网络(FC…

大数据分析仓库Kylin

一、Kylin 定义 Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区。它能在亚秒内查询巨大的 Hive 表。 二、Kylin 架构 A、REST Server 是应用程序…

操作系统基础操作

操作系统的启动 体系结构概念 CPU、I/O、内存-通过总线连接 操作系统一开始存放时没有放在内存里,而是当在DISK中,由BIOS提供相应支持 DISK:存放OSBIOS:基本I/O处理系统(计算机开机时可以让系统检测各种外设&#…