第十九章Java绘图

19.1Java绘图类

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

19.1.1Graphics类

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

19.1.2Graphics2D类

使用Graphics2D类可以完成简单的图形绘制任务,但是她所实现的功能非常有限,如无法改变线条的粗细,不能对图片使用旋转和模糊等过滤效果

Graphics2D类继承了Graphics类,实现了功能更加强大的绘图操作的集合。由于Graphics2D类 是Graphics类的拓展,也是推荐使用Java绘图类,

使用Graphics2D类来绘制空心和实心集合图形

例题如下:

import java.awt.BasicStroke;
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 DrawFarme1 extends JFrame{public DrawFarme1() {setTitle("绘制实例2");//设置窗体标本setTitle("绘制实例2");//设置窗体标本setSize(300,200);//设置窗体大小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) {Color c= new  Color(255,0,0);//绘制颜色g2.setColor(c);BasicStroke b =new BasicStroke(6,1,1);//绘制画笔粗细g2.setStroke(b);g2.fill(shape);//填充图像}else {Color c1 = new  Color(0,0,255);g2.setColor(c1);BasicStroke b =new BasicStroke(6,1,1);//绘制画笔粗细g2.setStroke(b);	g2.draw(shape);//绘制图形//圆形的端点是1  拐角是1//另一个是0是常规 1是圆 2是直}
}}}public static void main(String[] args) {new DrawFarme1().setVisible(true);}}

19.3绘制颜色和画笔属性 

java语言使用Color类封装颜色的各种属性,并对颜色进行管理。另外,在绘制图形是,还可以只盯线的粗细,和叙事等画笔属性,

19.3.1设置颜色

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

 
  1. Color col = new Color (int r , int g ,int b);

  2. Color col = new Color (int rgb);

  1. rgb:颜色值,该值是,红,绿,蓝,三原色的总和,

  2. r :该参数是三原色中的红色的取值;

  3. g :该参数是三原色中的绿色的取值;

  4. b :该参数是三原色中的蓝色的取值;

设置当前绘图颜色为红色的代码如下:

  1. public void paint(Graphics g){

  2. Graphics2D g2 =(Graphics2D )g;

  3. g.setColor(Color.RED)

  4. ...

  5. }

19.3.2  设置画笔

默认抢矿下Graphics类使用的画笔属性的粗细为1像素的正方形,而Graphics2D类可以体哦啊用setStroke()方法设置画笔的属性,如改变线条的粗细,叙事,定义线段端点的形状,风格等,如法如下:

setStroke(Stroke stroke)

其中参数stroke是Stroke接口的实现类对象、

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

BasicStroke();
BasicStroke(float width );
BasicStroke(float width  int cap,int join );
BasicStroke(float width , int cap , int join ,float minterlimit);
BasicStroke(float width , int cap , int join ,float minterlimit,float[] dash,float dash_phase);

cap参数可以使用CAP_BUTT,CAP_ROUND和CAO_SQUAR

19.4绘制文本

java会之类也可以用来绘制文本内容,且可以在会之前设置字体的样式和大小等,

19.4.1设置字体

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

Font font = new  Font("宋体",Font.BOLD,16);//这是文字为宋体    字体为加粗  定义字体大小

其中Font.BOLD 是调用字体格式   有三种 0是普通  1是加粗 (就是现在这个)2是倾斜如下所示

19.4.2显示文字

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

  1. drawString(String str , int x,int y);

  2. drawString(String str,float x , float y);

其中str是要绘制的文本字符串, x是绘制字符串的水平起始位置,  y是绘制字符串的垂直起始位置  

这两个方法唯一不同的就是x和y的参数类型不同

如下例题讲解了使用方法:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.Date;import javax.swing.JFrame;
import javax.swing.JPanel;public class DrawString extends JFrame{public DrawString(){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);Font font = new  Font("宋体",Font.BOLD,16);//这是文字为宋体    字体为加粗  定义字体大小Date date = new Date ();g2.setColor(Color.cyan);//设置当前绘图颜色g2.fill(rect);//填充矩形g2.setColor(Color.blue);//设置当前绘图颜色g2.setFont(font);//设置字体g2.drawString("现在的时间是", 20,30);//绘制文本g2.drawString(String.format("%tr", date),50,60);//绘制时间文本}}public static void main(String[] args) {new DrawString().setVisible(true);}}

代码图以及运行结果图:

19.5显示图片

绘制类不仅可以是绘制图形和文本还可以使用drawImage()方法将图片资源显示在绘图上下文中,而且可以是西安各种特效处理,如:图片的缩放,反转等。语法如下:

drawImage(drawImage img ,int x,int y,ImageObserver voserver)

img  是要显示的对象   x是水平位置,  y是垂直位置,observer是要通知的图像观察者

如下代码所示;

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 Drawlmage  extends JFrame{Image img;//展示图片public Drawlmage () {try {img=ImageIO.read(new File ("C:\\Users\\dog luo\\Desktop\\小黄人.jpg"));//读取图片位置}catch (IOException e ) {e.printStackTrace();}setSize(1000,3000);//设置窗体大小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, 0, 0, this);//显示图片}}public static void main(String[] args) {new Drawlmage().setVisible(true);}}

代码图运行结果:

19.6图像处理

开高级桌摆你应用程序,必须掌握一些图像处理与动画制作的技术,如在程序中显示统计图和销售趋势图,动态按钮等等

19.6.1放大与缩小

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

drawImage(Image img,int x, int y, int width , int height , ImageObserver observer)

该方法将img图片显示在x,y指定的位置上,并指定图片的宽度和高度的属性,

以下代码会讲解使用方法:

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;public class lmageZoom extends JFrame{
Image img;private int imgWidth ,imgHeight;private JSlider jSlider;public lmageZoom() {try {img = ImageIO.read(new File("C:\\Users\\dog luo\\Desktop\\搁浅.jpg"));}catch(IOException e) {e.printStackTrace();}CanvasPanel canvas = new CanvasPanel();jSlider = new JSlider();jSlider.setMaximum(1000);jSlider.setValue(100);jSlider.setMinimum(1);
jSlider.addChangeListener(new ChangeListener() {public void stateChanged(ChangeEvent e) {canvas.repaint();}});JSlider center= new JSlider();center.setLayout(new BorderLayout());center.add(jSlider,BorderLayout.SOUTH);center.add(canvas,BorderLayout.CENTER);setContentPane(center);setBounds(100,100,800,860);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/100);newH = (int)(imgHeight*value/100);g.drawImage(img,0,0,newW,newH,this );}}public static void main(String[] args) {new  lmageZoom().setVisible(true);}}

代码图以及运行结果图:

19.6.2图像翻转

图像的翻转需要使用drawImage()方法的另一个重载方法 语法如下:

drawImage(Image img , int dx1,int dy1,int dx2,int dy2, int sx1, int sy1, int sx2, int sy2,ImageObserver observer)

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

主要的使用方法以下例题会详细讲解:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class Partlmage extends JFrame{private Image img;private int dx1,dy1,dx2,dy2;private int sx1,sy1,sx2,sy2;private int width = 300,height=200;//图片宽高private JButton vBtn = null;//"垂直翻转"private JButton hBtn = null;//"水平反转"private CanvasPanel canvasPanel = null;public  Partlmage() {try {img=ImageIO.read(new File("C:\\Users\\dog luo\\Desktop\\搁浅.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(100,100,300,260);//设置窗体大小和位置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) {// TODO Auto-generated method stubnew Partlmage().setVisible(true);}}

19.6.3图像旋转

图像旋转需要调用Graphics2D类的rotate()方法,该方法根据指定的弧度来旋转图下   主要的语法如下:

rotate(double theta);//theta是直旋转的弧度

以下例题会讲解主要的使用方法:

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 RotateImage extends JFrame{
private Image img ; 
public RotateImage() {try {img = ImageIO.read(new File("C:\\Users\\dog luo\\Desktop\\搁浅.jpg"));//读取图片文件}catch(IOException e ) {e.printStackTrace();}setBounds(100,100,400,500);add(new CanvasPanel());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设施窗体关闭模式setTitle("图片旋转");//设置窗体标题;}
class CanvasPanel extends JPanel{public void paint(Graphics g) {Graphics2D g2 = (Graphics2D)g;g2.rotate(Math.toRadians(5));//旋转5g2.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  RotateImage().setVisible(true);
}
}

代码图以及运行结果图如下所示:

19.6.4图像倾斜 

可以使用Graphics2D类提供的sjear()放啊设置绘图的倾斜的方向,从而使图像侵袭呃的效果语法如下:

shear(double shx,double shy);
//shx 水平方向的倾斜度
//shy 垂直方向的倾斜度

详细的如下例题所示:

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 Tiltmage extends JFrame{private  Image img;public Tiltmage() {try {img = ImageIO.read(new File("C:\\Users\\dog luo\\Desktop\\搁浅.jpg"));//读取文件位置}catch(IOException e ) {e.printStackTrace();}setBounds(100,100,400,300);add(new CanvasPanel());setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设施窗体关闭模式setTitle("图片旋转");//设置窗体标题;}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 Tiltmage().setVisible(true);}
}

代码图以及运行结果图如下:

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

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

相关文章

PC业务校验(已有该名称,已有该编码)

rules: {name: [{ required: true, message: "部门名称不能为空", trigger: "blur" },{min: 2,max: 10,message: "部门名称的长度为2-10个字符",trigger: "blur",},{trigger: "blur",validator: async (rule, value, callba…

图像倾斜角度求取-Radon变换

Radon算法 Radon(拉东)算法是一种通过定方向投影叠加,找到最大投影值时角度,从而确定图像倾斜角度的算法。具体过程如图所示 图1 Radon变换算法 Radon计算示例 对于纹理方向明显的图像,如图2所示,可以通…

5.Java中的注释及Javadoc文档

本文讲解 Java 中的注释以及 Javadoc 文档 ~ 文章目录 1. 注释1.1 引言1.1.1 何为注释?1.1.2 注释有何用?1.1.2.1 方便阅读1.1.2.2 调试程序 1.1.3 单行注释和多行注释 1.2 方法注释1.2.1 什么是方法注释?1.2.2 如何写方法注释?1.…

C/C++通过位操作实现2个uint32_t合并为uint64_t

#include <iostream> using namespace std;int main() {uint32_t a 10;uint32_t b 600;//先将uint32_t的a转为uint64_t&#xff0c;此时a前面32位都是0&#xff0c;然后左移32位&#xff0c;此时右32位为0&#xff0c;最后加上uint32_t类型的b&#xff0c;填充右32位的…

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

Java 算法篇-链表的经典算法:有序链表去重、合并多个有序链表

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的说明 2.0 有序链表去重的实现方式 2.1 有序链表去重(保留重复的节点) - 使用递归来实现 2.2 有序链表去重(保留重复的节点) - 使用双指针来实现 2.3 有序…

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

Bulk RNA-seq上下游分析

Bulk-RNA-seq上下游分析还是相对简单的&#xff0c;这次我以mouse为例&#xff0c;进行Bulk-RNA-seq上下游分析&#xff0c;并进行对应的图片绘制。 上游分析 1.软件准备 #安装所需软件 sudo apt install fastqc sudo apt install hisat2 sudo apt install cutadapt sudo ap…

场景交互与场景漫游-交运算与对象选取(8-1)

交运算与对象选取 在面对大规模的场景管理时&#xff0c;场景图形的交运算和图形对象的拾取变成了一项基本工作。OSG作为一个场景管理系统&#xff0c;自然也实现了场景图形的交运算&#xff0c;交运算主要封装在osgUtil 工具中在OSG中&#xff0c;osgUtil是一个非常强有力的工…

HWS-CTF-第七期山大站-inverse

文章目录 inversemainworkread_intread_n 思路onegadget exp 第一次真正意义上独立在比赛中做出题目来了&#xff0c;距离真正意义接触CTF-PWN差不多正好两个月。但由于不知道靶场要自己开而且端口每次自己打开会改&#xff0c;交flag稍微晚了些&#xff08;我太菜了&#xff0…

Linux之进程概念(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、冯诺依曼体系结构二、操作系统(Operator System)1、概念2、设计OS的目的3、定位4、如何理…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…