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

时间:2019-04-10 14:01:59

标签: java graphics2d shapes fill invert

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

仅需编写以下内容即可轻松用Color填充圆圈:

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

但是,我想要的却与此相反。我不想填充受数字(x,y,width,height)限制的椭圆形内部,而是填充其外部的所有内容。

我在这方面几乎没有成功。我想到的唯一一件事就是在我想让圆占据的空间周围绘制 HUGE 拱形,因为我很难弄清楚数学来计算它。

编辑:之所以不能只填充整个图像然后在其上绘制圆圈,是因为圆圈中的颜色不是单一的颜色,而是我想拍摄一张图像(任何图像,例如我的照片),并能够在该图像中间的圆圈周围添加单色。因此,在画圆之前,已经在圆中间的任何地方都已经存在,而且它并不是一开始就由代码绘制的东西。

3 个答案:

答案 0 :(得分:1)

这是一个基于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)部分):

enter image description here

带修剪(外部充满黑色)  :

enter image description here

答案 1 :(得分:0)

如果要使背景为纯色并留下椭圆形的白色怎么办?

 JPanel.setBackgroundColor(Color.black);

然后绘制并填充椭圆形

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

这应该有助于对比它们

答案 2 :(得分:0)

数学是这样的

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

cat = CatBoostClassifier(loss_function='Logloss',
                         verbose = False,
                        eval_metric='AUC',
                        iterations=500,
                         thread_count = None,
                        random_state=SEED)
print cat.get_params()

{'iterations': 500, 'random_state': 42, 'verbose': False, 'eval_metric': 'AUC', 'loss_function': 'Logloss'}

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