Graphics2D绘制图形详解

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Graphics2D绘制图形详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

最近在使用java开发一个二维码生成器。其中涉及到二维码码点、码眼睛、背景图、logo等绘制,都需要使用到Graphics2D,Graphics2D绘制图形就变成了必须会的储备知识,但是网上针对Graphics2D使用详解的不够细致,自己又翻阅官网从头学了一遍,下面我将分两篇将Graphics2D绘制简单图形到复杂图形的绘制全部实例代码记录下来,希望能帮到大家。

官网地址: https://docs.oracle.com/javase/tutorial/2d/geometry/primitives.html

生成二维码效果:https://blog.csdn.net/u011837804/article/details/129229973

先说下绘制的基本要求:原点(0,0)坐标是在绘图区域的左上角

Graphics2D绘制图形详解

1、Point

Point代表图中的一个点,用(x,y)表示,创建方式如下

        // int
        Point point = new Point(0, 0);
        // double
        Point2D point1 = new Point2D.Double(1D, 1D);
        // float
        Point2D point2 = new Point2D.Float(1.0F, 1.0F);

2、Line

该类 Line2D表示 (x, y) 坐标空间中的线段实现创建方式如下

        Line2D line2D = new Line2D.Double(0D, 0D, 100D, 100D);
        Line2D line2D1 = new Line2D.Float(0F, 0F, 100F, 100F);

创建一条线代码实例:

        public BufferedImage loadImage() {
            return new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
        }    
    
        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);
        //代表 从坐标  (1,1)   到  (100,100) 坐标画一条红线
        graphics2D.draw(new Line2D.Double(1, 1, 100, 100));
        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "line.png"));

执行结果:

Graphics2D绘制图形详解

3、二次曲线段

使QuadCurve2D能够创建二次参数曲线段。二次曲线由两个端点和一个控制点定义。

Graphics2D绘制图形详解

该类实现Shape接口。此类表示 (x, y) 坐标空间中的二次参数曲线段。和子类指定浮点和双精度QuadCurve2D.Float的QuadCurve2D.Double二次曲线。

有几种setCurve方法用于指定曲线的两个端点和一个控制点,其坐标可以通过其他点的坐标和使用给定的数组直接定义。

一种非常有用的方法 ,setCurve(QuadCurve2D)将具有相同端点和控制点的二次曲线设置为提供的曲线

代码:

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);
        // 创建新的 QuadCurve2D.Float
        QuadCurve2D q = new QuadCurve2D.Float();

        //使用设置的坐标绘制 QuadCurve2D.Float
        double x1 = 10; //起点X坐标
        double y1 = 10; //起点Y轴坐标
        double ctrlx = 10; //控制点x坐标
        double ctrly = 60; //控制点y坐标
        double x2 = 100;     //终点x坐标
        double y2 = 10;     //终点y坐标
        q.setCurve(x1, y1, ctrlx, ctrly, x2, y2);
        graphics2D.draw(q);
        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "Curve.png"));

实现效果:

Graphics2D绘制图形详解

4、三次曲线段

该类 CubicCurve2D实现 Shape接口。表示 (x, y) 坐标空间中的三次参数化曲线段。CubicCurve2D.Float和CubicCurve2D.Double子类指定浮点和双精度的三次曲线。

代码:

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);

        // 创建新的 CubicCurve2D.Double
        CubicCurve2D c = new CubicCurve2D.Double();
        // 使用设置的坐标绘制 CubicCurve2D.Double
        c.setCurve(10, 40, 30,
                5, 60, 40, 100, 30);
        graphics2D.draw(c);
        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "Curve2.png"));

效果:

Graphics2D绘制图形详解

5、长方形

绘制长方形使用Rectangle2D绘制,该类扩展了类RectangularShape,RectangularShape实现了Shape接口并添加了一些自己的方法。

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);
        // 绘制 Rectangle2D.Double
        int x = 10;//矩形起始坐标x  从左上角
        int y = 10;//矩形起始坐标y  从左上角
        int rectWidth = 100; //矩形宽
        int rectHeight = 50; //矩形高度
        graphics2D.draw(new Rectangle2D.Double(x, y,
                rectWidth,
                rectHeight));
        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "Rectangle.png"));

效果:

Graphics2D绘制图形详解

6、圆角矩形

通过RoundRectangle2D实现圆角矩形绘制,也继承至RectangularShape

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);

        int x = 10;//矩形起始坐标x  从左上角
        int y = 10;//矩形起始坐标y  从左上角
        int rectWidth = 100; //矩形宽
        int rectHeight = 50; //矩形高度
        double arcw = 10; //角弧宽度
        double arch = 10; //角弧高度
        graphics2D.draw(new RoundRectangle2D.Double(x, y,
                rectWidth,
                rectHeight, arcw, arch));

        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "RoundRectangle2D.png"));

效果:

Graphics2D绘制图形详解

7、椭圆、圆

绘制椭圆、圆由Ellipse2D类实现

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);

        int x = 1;//矩形起始坐标x  左上角点
        int y = 1;//矩形起始坐标y  左上角点
        //宽度和高度 相等则是画原型
        int rectWidth = 100; //椭圆宽度
        int rectHeight = 100; //椭圆高度

        // 绘制圆
        graphics2D.draw(new Ellipse2D.Double(x, y,
                rectWidth,
                rectHeight));

        // 绘制椭圆
        graphics2D.draw(new Ellipse2D.Double(x + 150, y + 150,
                rectWidth,
                rectHeight / 2));

        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "Ellipse2D.png"));

效果:

Graphics2D绘制图形详解

8、圆弧、闭合圆弧、扇形

通过Arc2D类绘制实现圆弧、闭合圆弧、扇形

实例:

        BufferedImage image = loadImage();
        Graphics2D graphics2D = image.createGraphics();
        graphics2D.setColor(Color.RED);

        int x = 10;//矩形起始坐标x  左上角点
        int y = 10;//矩形起始坐标y  左上角点
        int rectWidth = 100; //椭圆宽度
        int rectHeight = 100; //椭圆高度
        int start = 90; //弧的起始角度
        int extent = 135;//弧的角度范围

        // 圆弧
        graphics2D.draw(new Arc2D.Double(x, y,
                rectWidth,
                rectHeight,
                90, 135,
                Arc2D.OPEN));

        // 圆弧闭合
        graphics2D.draw(new Arc2D.Double(x + 50, y + 50,
                rectWidth,
                rectHeight,
                90, 135,
                Arc2D.CHORD));

        // 扇形
        graphics2D.draw(new Arc2D.Double(x + 100, y + 100,
                rectWidth,
                rectHeight,
                90, 135,
                Arc2D.PIE));


        graphics2D.dispose();
        image.flush();
        ImgUtil.write(image, new File(SAVE_FILE_PATH + "Arc2D.png"));

效果:

Graphics2D绘制图形详解

下篇文章我们继续通过Graphics2D类绘制包含菱形、五角星等任意复杂图形,喜欢的朋友记得关注,下篇见。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/144614.html

(0)

相关推荐

  • 设计模式总述

    在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

    导读:本篇文章讲解 设计模式总述,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    Java自学入门 2023年3月5日
    00
  • 【2022最新Java面试宝典】—— Dubbo面试题(47道含答案)

    追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

    导读:本篇文章讲解 【2022最新Java面试宝典】—— Dubbo面试题(47道含答案),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    Java 2023年4月6日
    00
  • 【Spring6】| Spring的入门程序、集成Log4j2日志框架

    追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

    导读:本篇文章讲解 【Spring6】| Spring的入门程序、集成Log4j2日志框架,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    后端开发 2023年3月27日
    00
  • 对 Nginx 的初步了解

    导读:本篇文章讲解 对 Nginx 的初步了解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    Java 2022年5月23日
    00
  • Go Quiz: 从Go面试题看函数命名返回值的注意事项

    题目 Redhat的首席工程师、Prometheus开源项目Maintainer Bartłomiej Płotka[1] 在Twitter上出了一道Go编程题,结果超过80%的人…

    2022年10月4日
    00
  • 阿里巴巴开发手册二

    导读:本篇文章讲解 阿里巴巴开发手册二,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    Java 2022年5月22日
    00
  • Spring事务、事务隔离级别、事务传播机制

    导读:本篇文章讲解 Spring事务、事务隔离级别、事务传播机制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    后端开发 2023年2月6日
    00
  • SpringBoot的基本使用2

    导读:本篇文章讲解 SpringBoot的基本使用2,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    2022年5月15日
    00
  • Python实战之数字、日期和时间的高级处理

    写在前面 博文为《Python Cookbook》读书后笔记整理 涉及内容包括: 浮点数执行指定精度的舍入运算。 执行精确的浮点数运算 数字的格式化输出 对数值进行取整 二进制、八…

    2022年12月4日
    00
  • Servlet 入门到精通(二)

    导读:本篇文章讲解 Servlet 入门到精通(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    2022年5月17日
    00

发表回复

登录后才能评论