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

How to Fill Color Outside of a Shape (an Oval)

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

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

Graphics2D g2d = <my_image>.createGraphics();
...
g2d.fillOval(x, y, width, height);

然而,我想要的恰恰相反。我不想填充由数字定义的椭圆形内部 (x, y, width, height) 我想填充它外面的所有东西。

我在这方面收效甚微。唯一想到的就是在 space 周围绘制 HUGE 拱门 我希望圆圈占据,因为我很难弄清楚数学计算一下。

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

如果您要将背景设为纯色并且将椭圆形的内部留白会怎样?

 JPanel.setBackgroundColor(Color.black);

然后绘制并填充你的椭圆

g2d.setColor(Color.white);
g2d.drawOval(x, y, width, height);
g2d.fillOval(x, y, width, height);

这应该可以作为一个例子来对比它们

这是一个基于 Java anti fillRect (fill everything outside of said rectangle).

回答的示例

它使用 java.awt.geom.Area 中的 substract 方法。

        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);

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

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

数学是这样的:

如果你知道圆在 (x, y) 处并且半径为 r

for(i=0; i<width; i++)
for(j=0; j<height; j++)
  if((i-x)*(i-x)+(j-y)*(j-y))>r*r)
    b.setRGB(i, j, 0xff0000);

这会将 BufferedImage b 在圆圈外涂成红色。