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

5
我希望能够使用 Graphics2D 实例在 BufferedImage 上绘制图形,并填充 Shape 外部的颜色。如果这是一个矩形之类的 Shape,那么这很容易,但我需要处理的形状是圆形。
要填充圆形的颜色很容易,只需编写如下代码:
Graphics2D g2d = <my_image>.createGraphics();
...
g2d.fillOval(x, y, width, height);

然而,我想要的与此相反。我想填充由数字 (x, y, width, height) 定义的椭圆形内部之外的所有内容。

我在这方面几乎没有什么成功经验。唯一想到的事情是在我想要圆圈占据的空间周围绘制巨大的拱形,但我很难计算出这个过程中的数学运算。

编辑:我不能只填充整个图像,然后再对圆圈进行涂色,因为圆圈中的内容不是单一的颜色,而是我想要在图像(如我的照片)的中心添加一个圆圈周围的单一颜色。因此,在绘制周围区域时,圆形中间的任何内容都已经存在,而且不是首先通过代码绘制的东西。


2
整个背景都用新颜色涂一遍,然后再画圆怎么样? - Arnaud
那样做不行(请参见编辑) - Anju Maaka
3个回答

3
这里是基于Java反填充矩形(用颜色填充矩形外的区域)答案的示例。
它使用了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)部分):

输入图像描述

进行裁剪(外部部分填充黑色):

输入图像描述


1
这看起来很完美,我喜欢使用我的个人资料图片的细节 XD。 - Anju Maaka

0
如果您将背景设置为纯色,并将椭圆形内部保留为白色,会怎样呢?
 JPanel.setBackgroundColor(Color.black);

然后绘制并填充您的椭圆形

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

这应该可以用来对比举例


0

数学公式如下:

如果你知道圆心坐标为 (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 在圆形的外侧变为红色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接