如何在形状(椭圆形)外部填充颜色

Anj*_*aka 5 java shapes fill graphics2d

我希望能够使用 Graphics2D 实例在 BufferedImage 上绘图,并在形状外部填充颜色。如果这是一个诸如矩形之类的形状,那就很容易了,但是我需要使用的形状是一个圆形。

用颜色填充圆圈很容易,只需编写:

Graphics2D g2d = <my_image>.createGraphics();
...
g2d.fillOval(x, y, width, height);
Run Code Online (Sandbox Code Playgroud)

然而,我想要的却与此相反。我不想填充由数字(x,y,宽度,高度)定义的椭圆形内部,而是填充其外部的所有内容。

我在这方面几乎没有取得什么成功。唯一想到的就是在我想要圆圈占据的空间周围画出巨大的拱门,因为我很难弄清楚计算它的数学方法。

编辑:我不能先填充整个图像然后再画圆圈的原因是因为圆圈中的不是单一颜色,而是我想拍摄一张图像(任何图像,例如我自己的照片) )并能够在该图像中间的圆圈周围添加单一颜色。因此,圆圈中间的任何内容在围绕它进行绘制之前就已经存在,并且它首先不是由代码绘制的东西。

Arn*_*aud 3

这是一个基于Java anti fillRect (fill everything external of thequarant)的答案的示例。

它使用从 中减去java.awt.geom.Area方法。

        Area outter = new Area(new Rectangle(0, 0, img.getWidth(), img.getHeight()));
        int x = (img.getWidth() / 4) ;
        int y = (img.getHeight() / 4);
        Ellipse2D.Double inner = new Ellipse2D.Double(x,y, img.getWidth()/2, img.getHeight()/2);
        outter.subtract(new Area(inner));// remove the ellipse from the original area

        g2d.setColor(Color.BLACK);
        g2d.fill(outter);
Run Code Online (Sandbox Code Playgroud)

没有裁剪(即没有g2d.fill(outter)部分):

在此输入图像描述

裁剪后(外部填充黑色):

在此输入图像描述