java绘图(基于Graphics2D) 您所在的位置:网站首页 java画图直线和圆形怎么画 java绘图(基于Graphics2D)

java绘图(基于Graphics2D)

2024-06-24 04:57| 来源: 网络整理| 查看: 265

1.绘图基本操作

请参考下面基础示例:

1 int width = 200, height = 250; 2 //创建图片对象 3 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); 4 //基于图片对象打开绘图 5 Graphics2D graphics = image.createGraphics(); 6 //绘图逻辑 START (基于业务逻辑进行绘图处理)…… 7 8 //绘制圆形 9 graphics.setColor(Color.BLACK); 10 Ellipse2D.Double ellipse = new Ellipse2D.Double(20, 20, 100, 100); 11 graphics.draw(ellipse); 12 13 // 绘图逻辑 END 14 //处理绘图 15 graphics.dispose(); 16 //将绘制好的图片写入到图片 17 ImageIO.write(image, "png", new File("abc.png"));

如上代码所示,使用java绘图基本操作流程如下:

  a.得到一个 BufferedImage ,可以是直接指定分辨率new一个空图片,也

  b.基于此BufferedImage 创建一个绘图对象,使用 createGraphics 方法,得 Graphics2D 实例

  c.使用Graphics2D 实例进行画图,所有绘图坐标基于创建此Graphics2D 的BufferedImage。示例中在图片上画了一个圆形。

  d.调用Graphics2D 对象的 dispose() 方法,进行绘图处理,使绘图效果应用到BufferedImage 对象

  e.使用ImageIO类的write函数将图片对象转换到文件或二进制流

 

上面是使用java进行绘图的基本流程,其中步骤c涉及到很多绘图细节。下面总结一些常用绘图操作:

 

限制绘图区域

如果绘图时,只希望指定范围内的区域绘图生效,其他区域不受影响,我们可以使用 setClip 函数Shape区域对象作为参数设置剪辑区域

Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, diameter, diameter); Graphics2D graphics = formatAvatarImage.createGraphics(); //设置剪辑区域,范围外的区域不受绘图影响。这里指定圆形区域作为绘制区域 graphics.setClip(shape); // 将另一张图片绘制到图像中, graphics.drawImage(avatarImage, (diameter - width + circleW) / 2, (diameter - height + circleW) / 2, null); graphics.dispose();

 

 

图形的原点坐标:

 由于绘制图形时,所有绘制都基于坐标进行绘制,所以绘制之前必须了解图形的原点坐标,才能将图形绘制到准确的位置

  1.方形:方形的原点坐标位于左上角(图片本身都是方形,因此在图像中绘制另一张图片时,图片的原点坐标也在左上角)

  2.椭圆形: 椭圆形的原点坐标位于圆心

  3.文字:文字的原点坐标位于左侧与基线的交点上(参考后面绘制文字)

 

绘制图片

  图片绘制主要分三步

  1.将图片转换为BufferedImage 对象

  2.计算绘制位置

  3.进行绘制

1 //将图片转换为BufferedImage对象 2 BufferedImage bufferedImage = ImageIO.read(new File("C:\\Users\\minggliu\\Pictures\\test\\test.png")); 3 //计算绘制位置 4 int x = 0, y = 0; 5 //执行绘制 6 //graphics.drawImage(bufferedImage.getScaledInstance(imageW, imageH, Image.SCALE_DEFAULT),100, 100, null); 7 //graphics.drawImage(bufferedImage, 0, 0, width / 2, height / 2, null); 8 graphics.drawImage(bufferedImage, x, y, null);

注意到上面执行绘制注释了上面两种,

 a.使用

graphics.drawImage(bufferedImage, x, y, null);绘制图片不会进行resize

b.使用

graphics.drawImage(bufferedImage, 0, 0, width / 2, height / 2, null);绘制图片,系统会将图片resize到 width / 2, height / 2 大小

c.使用

graphics.drawImage(bufferedImage.getScaledInstance(imageW, imageH, Image.SCALE_DEFAULT),100, 100, null);

 绘制图片则先进行了resize,再画到对应的位置,结果与b相同,不过预先的resize有更多的功能,可以指定resize方式

 

对于一些特殊resize要求,需要走代码逻辑进行特殊处理,下面给出常用resize方式:

以图形中间为原点进行无压缩裁剪resize:

public static BufferedImage resize(BufferedImage image, int needW, int needH) { int resizeW, resizeH, resizeX, resizeY; int imgW = image.getWidth(), imgH = image.getHeight(); int wantH = imgW * needH / needW; //如果图片属于过方形 if (wantH


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有