第19章JAVA绘图

news2024/9/23 11:22:03

19.1JAVA绘图类
绘图是高级程序设计中非常重要的技术

19.1.1Graphics类
Graphics类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图片上进行绘制

Graphics类封装了JAVA支持的基本绘图操作所需的状态信息,主要包括颜色,字体,画笔,文本,图像等。

19.1.2Graphics2D类
使用Graphics类可以完成简单的图形绘制任务,但功能有限,无法改变线条的粗细,不能对图片进行

19.2绘制图形
JAVA可以分别使用Graphics类和Graphics2D类绘制图形
例题19.1

package java19lx;
 
import java.awt.Graphics;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Demo19_1 extends JFrame {
	private final int W=80;//高
	private final int H=80;//宽
	
	public Demo19_1() {
		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, W, H);//绘制第1个图形
			g.drawOval(80, 10,W, H);//绘制第2个图形
			g.drawOval(150, 10,W, H);//绘制第3个图形
			g.drawOval(50, 70, W, H);//绘制第4个图形
			g.drawOval(120, 70,W, H);//绘制第5个图形
			
		}
	}
	public static void main(String[]args) {
		new Demo19_1().setVisible(true);
	}
}
结果

Graphics类常用的图形绘制方法

 

Graphics2D类是在继承Graphics类的基础上编写的,包含了Graphics类的绘制方法,并添加了更强的功能,在绘制绘图类时推荐使用,Graphics2D类可以分别使用不同的类,表示不同的形状。

要绘制指定形状的图形,需要先创建并初始化该图形类的对象,且这些类图形类必须是Shape接口的实现类,然后使用Graphics2D类的draw()方法绘制该图形对象或者使用fil(0l方法填充该图形对象语法格式如下

draw(Shape form)

fill(Shape form)

form是Shape接口的对象

例题19.2

package java19lx;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Demo19_2 extends JFrame {
	public Demo19_2(){//初始化方法
		setTitle("绘图实例2");//设置窗体标题
		setSize(300,300);//设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭模式
		add(new CanvasPanel());//设置窗体面板为绘图面板对象
	}
	class CanvasPanel extends JPanel{//绘图面板
		public void paint(Graphics g) {
			Graphics2D g2=(Graphics2D)g;
			Shape[]shapes=new Shape[4];//声明图形数组
			shapes[0]=new Ellipse2D.Double(5,5,100,100);//创建圆形对象
			shapes[1]=new Rectangle2D.Double(110,5,100,100);//创建矩形对象
			
			shapes[2]=new Rectangle2D.Double(15,15,80,80);//创建矩形对象
			shapes[3]=new Ellipse2D.Double(120,15,80,80);//创建圆形对象
			
			for(Shape shape:shapes) {//遍历图形数组
				Rectangle2D bounds=shape.getBounds2D();
				if(bounds.getWidth()==80) {
					
					g2.fill(shape);//填充图形
				}
					else {
						
						g2.draw(shape);//绘制图形
						
				}
			}
			
		}
	}
	public static void main(String[] args) {
		new Demo19_2().setVisible(true);
 
	}
 
}

结果

 

19.3绘图颜色与画笔属性

19.3.1设置颜色

使用 Color 类可以创建任意颜色的对象,不用担心平台是否支持改颜色,因为 Java 以跨平台和与硬件无关的方式支持颜色管理。

 

 

 

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

        setStroke() 方法必须接受一个Stroke 接口的实现类对象作参数,java.awt 包中提供了BasicStroke 类,它实行了了 Stroke  接口,并且通过不同的构造方法创建画笔不同对象。

19.4绘制文本
19.4.1设置字体
Java使用 Font 类封装了字体的大小、样式等属性,该类在 java.awt 包中定义,其构造方法可以指定字体的名称、大小和样式3个属性。

19.4.2显示文字
 Graphics2D 类提供了 drawString()方法,使用该方法可以实现图形上下文的文本绘制,从而实现在图片上显示文字的功能。

例题19.3

package java19lx;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Date;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
import java19lx.Demo19_2.CanvasPanel;
 
public class Demo19_3 extends JFrame{
	public Demo19_3() {		
		setSize(230,140);//设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭模式
		add(new CanvasPanel());//设置窗体面板为绘图面板对象
		setTitle("绘图文本");//设置窗体标题
	}
	class CanvasPanel extends JPanel{
		public void paint(Graphics g) {
			Graphics2D g2=(Graphics2D) g;
			Rectangle2D rect=new Rectangle2D.Double(10, 10, 200, 80);
			g2.setColor(Color.CYAN);//设置当前绘图颜色
			g2.fill(rect);//填充矩形
			Font font=new Font("宋体",Font.BOLD,16);
			g2.setColor(Color.BLUE);//设置当前绘图颜色
			g2.setFont(font);//设置字体
			g2.drawString("现在时间是", 20, 30);//绘制文本
			Date date=new Date();
			g2.drawString(String.format("%tr", date), 50, 60);//绘制时间文本
		}
		
	}
 
	public static void main(String[] args) {
		new Demo19_3().setVisible(true);
	}
 
}

结果:

 

19.5显示图片

 绘图不仅可以绘制图形和文本,还可以使用 drawImage() 方法将图片资源显示到绘图上下文中,而且可以实现各种特效处理。

例题19.4

package java19lx;
 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Demo19_4 extends JFrame{
	Image img;//展示的图片
	
	public Demo19_4(){
		try {
			img=ImageIO.read(new File("src/徽章.png/"));//读取图片文件
			
		}catch(IOException e){
			e.printStackTrace();
		}
		setSize(440,300);//设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭模式
		add(new CanvasPanel());//设置窗体面板为绘图面板对象
		setTitle("绘制图片");//设置窗体标题
		
	}
	class CanvasPanel extends JPanel{
		public void paint(Graphics g) {
			Graphics2D g2=(Graphics2D)g;
			g2.drawImage(img, 100, 0, this );//显示图片
			//x,y,哪个图片
			
		}
	}
	public static void main(String [] args) {
		new Demo19_4().setVisible(true);
	}
}

结果

 

19.6图像处理

19.6.1放大与缩小

使用了 drawImage() 方法将图片以原始大小显示在窗体中,要想实现图片的放大与缩小,则需要使用他的重载方法。

例题19.5

package java19lx;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class Demo19_5 extends JFrame {
	Image img;
	private int W,H;
	private JSlider jSlider;
	
	public Demo19_5() {
		try {
			img=ImageIO.read(new File("src/徽章.png"));//读取图片
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		CanvasPanel can=new CanvasPanel();
		jSlider=new JSlider();
		jSlider.setMaximum(1000);
		jSlider.setValue(100);
		jSlider.setMinimum(1);
		jSlider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				can.repaint();
				
			}
		});
		JPanel center=new JPanel();
		center.setLayout(new BorderLayout());
		center.add(jSlider,BorderLayout.SOUTH);
		center.add(can,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;
			W=img.getWidth(this);//获取图片宽度
			H=img.getHeight(this);//获取图片高度
			float value=jSlider.getValue();//滑块组件的取值
			newW=(int)(W*value/100);//计算图片放大后的宽度
			newH=(int)(H*value/100);//计算图片放大后的高度
			g.drawImage(img,0,0,newW,newH,this);//绘制指定大小的图片
			
		}
	}
	public static void main(String[] args) {
		new Demo19_5().setVisible(true);
 
	}
 
}
 

结果:

 

 

 

19.6.2图像翻转
图像的翻转需要使用 drawImage() 方法的另一个重载方法。

        此方法总是用来非缩放的图像来呈现缩放的矩形,并动态地执行所需要的缩放。此操作不使用缓存的缩放图像。执行图像从源到目标的缩放,要将源矩形的第一个坐标映射到目标矩形的第一个坐标,源矩形的第二个坐标映射到目标矩形的第二个坐标,按需要缩放和翻转子图像,以保持这些映射关系。

例题19.6

package java19lx;
 
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
 
 
public class Demo19_6 extends JFrame {
	private Image img;
	private int dx1,dy1,dx2,dy2;
	private int sx1,sy1,sx2,sy2;
	private int W=300,H=200;
	private JButton v=null;
	private JButton h=null;
	private CanvasPanel canvasPanel=null;
	public Demo19_6() {
		try {
			img=ImageIO.read(new File("src/徽章.png"));
		}catch(IOException e) {
			e.printStackTrace();
		}
		dx2=sx2=W;
		dy2=sy2=H;
		v=new JButton("垂直旋转");
		h=new JButton("水平翻转");
		JPanel botton=new JPanel();
		botton.add(h);
		botton.add(v);
		Container c=getContentPane();
		c.add(botton,BorderLayout.SOUTH);
		canvasPanel =new CanvasPanel();
		c.add(canvasPanel,BorderLayout.CENTER);
		
		addListener();
		
		setBounds(100,100,300,260);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("图片翻转");
				
	}
	private void addListener() {
		v.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sy1=Math.abs(sy1-H);
				sy2=Math.abs(sy2-H);
				canvasPanel.repaint();
			}
		});
		h.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sx1=Math.abs(sx1-W);
				sx2=Math.abs(sx2-W);
				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 Demo19_6().setVisible(true);
 
	}
 
}

结果:

 

 

19.6.3图像旋转

图像旋转需要调用 Graphics2D 类的 rotate()方法,该方法将根据指定的弧度旋转图像。

例题19.7

 

package java19lx;
 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Demo19_7 extends JFrame {
	private Image img;
	private Demo19_7() {
		try {
			img=ImageIO.read(new File("src/徽章.png"));//读取图片
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		setBounds(100,100,400,350);//设置窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭模式
		setTitle("图片旋转");//设置窗体标题
		add(new CanvasPanel());
	}
	class CanvasPanel extends JPanel{
		public void paint(Graphics g) {
			Graphics2D g2=(Graphics2D) g;
			g2.rotate(Math.toRadians(5));//旋转5°,传入的是弧度值
			g2.drawImage(img, 70, 10, 300, 200, this);
			g2.rotate(Math.toRadians(5));
			g2.drawImage(img, 70, 10, 300, 200, this);
			g2.rotate(Math.toRadians(5));
			g2.drawImage(img, 70, 10, 300, 200, this);
			
		}
	}
	public static void main(String[] args) {
		new Demo19_7().setVisible(true);
 
	}
 
}

结果:

19.6.4图像倾斜

可以使用 Graphics2D 类提供的 shear()方法设置绘图的倾斜方向,从而使图像实现倾斜的效果。

例题19.8
package java19lx;
 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Demo19_8 extends JFrame{
	private Image img;
	public Demo19_8() {
		try {
			img=ImageIO.read(new File("src/徽章.png"));//读取图片
			
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		setBounds(100,100,400,300);//窗体大小
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭模式
		setTitle("图片倾斜");//窗体标题
		add(new CanvasPanel());
	}
	class CanvasPanel extends JPanel{
		public void paint(Graphics g) {
			Graphics2D g2=(Graphics2D)g;
			g2.shear(0.3,0);//倾斜30%
			g2.drawImage(img,0,0,300,200,this);
		}
	}
	public static void main(String[] args) {
		new Demo19_8().setVisible(true);
 
	}
 
}

结果:

 

 

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

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

相关文章

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1)创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02)修改可打开文件数(每个节点&#x…

jenkins 参数构建

应用保存 [rootjenkins-node1 .ssh]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved i…

yolov3学习总结

目标检测算法 单阶段:不提取出候选框,直接将整个图像输入模型中,算法直接输出检测结果,端到端 yolo,ssd 端到端,输入图像到网络中,然后从网络中输出图像 二阶段:先从图像中提取出…

探讨工业元宇宙和数字孪生的关系

就在各类技术专家还在试图设想元宇宙虚拟世界将为企业和消费者带来什么时,工业元宇宙虚拟世界已经在改变人们设计、制造以及与各行业物理实体互动的方式。尽管元宇宙的定义比比皆是,工业元宇宙将如何发展还有待观察,但数字孪生越来越多地被视…

面试cast:reinterpret_cast/const_cast/static_cast/dynamic_cast

目录 1. cast 2. reinterpret_cast 3. const_cast 3.1 加上const的情况 3.2 去掉const的情况 4. static_cast 4.1 基本类型之间的转换 4.2 void指针转换为任意基本类型的指针 4.3 子类和父类之间的转换 5. dynamic_cast 5.1 RTTI(Run-time Type Identification) 1.…

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入,主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据,使用Insert语句插入性能较低,此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …

计算机基础知识57

前后端数据传输的编码格式(contentType) # 我们只研究post请求方式的编码格式: get请求方式没有编码格式-- index?useranme&password get请求方式没有请求体,参数直接在url地址的后面拼接着 # 有哪些方式可以提交post请求:f…

SAP GOS与DMS简介

通常在项目实施过程中很多业务数据需要管理对应的系统外的附件, 制造业的BOM需要对应图纸,采购订单需要对应线下的采购合同,物料需要对应相应的参数文件等等,很多产品都会遇到业务数据和系统外相关资料的关联,有PDF的文…

2002-2020年341个地级市农业保险收入数据

2002-2020年341个地级市农业保险收入数据 1、时间:2002-2020年 2、范围:341个地级市 3、指标:农业保险收入 4、来源:整理自wind、保险年鉴 5、指标解释: 农业保险保费收入是指保险公司从农户或农业生产经营者那里…

聊一聊Linux动态链接和GOT、PLT

共享动态库是现代系统的一个重要组成部分,大家肯定都不陌生,但是通常对背后的一些细节上的实现机制了解得不够深入。当然,网上有很多关于这方面的文章。希望这篇文章能够以一种与其他文章不同的角度呈现,可以对你产生一点启发。 …

@Scheduled注解 定时任务讲解

用于在Java Spring框架中定时执行特定任务的注解 Scheduled,它能够指定方法在特定时间间隔或特定时间点执行。默认参数是cron,cron参数被用来定义一个Cron表达式,它代表了任务执行的时间规则 参数如下 Cron 这是是一种时间表达式&#xff…

Python版本切换的解决方法,升级Python 2.7 到 Python 3.7

之前解决问题的时候,记录的一个Python版本切换的解决方法,今天在解决其他问题的时候,查看了下之前写的这个解决方法。还是很适用的。然后加入了下linux系统中python配置修改的问题。 Mac 升级Python 2.7 到 Python 3.7 1、python3.7官网下载…

【SpringBoot】 This application has no explicit mapping for 解决方法

This application has no explicit mapping for 解决方法 This application has no explicit mapping for 解决方法一、背景二、原因三、解决方案方式一:方式二: 四、解决 This application has no explicit mapping for 解决方法 一、背景 在SpringBo…

EXCEL小技巧

1、两列文本合并显示: CONCATENATE(B6,E6) (如果显示公式而非文本,就是公式输错了,比如后缺少空格)

Word中如何实现 图片 | 表格 自动编号与文中引用编号对应

当我们在进行大篇幅word文档的编写时,为了节约修改文章中图片或表格所花费的大量时间,可以将图片自动编号,且让文中引用的顺序跟着图片顺序的变化而变化,具体操作如下: 1. 将鼠标定位在图片或者表格欲加编号的下方或上…

ChatGPT有效开通方法*建议收藏*

ChatGPT Plus和API开通方法*建议收藏* 前期准备: 一个ChatGPT账户 一张虚拟卡 开通ChatGPT Plus会员,很多朋友担心虚拟卡订阅会封号,只要不勤换登陆IP不会使出现问题。而且目前大部分用户都是使用虚拟卡开通的会员 第一步:登…

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02地址码并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02地址码并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次(at least once)3.2 至多一次(ai most once)3.3 恰好一次&…

交叉编译安装时报错 ./install.sh: 15: ./install.sh: Bad substitution

报错信息截图如下: 解决方法 vim install.sh #!/bin/sh -e 修改为 !/bin/bash -e重新执行 sudo ./install.sh 成功运行

Leetcode算法系列| 1. 两数之和(四种解法)

目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…