如何有效地清除Java中的部分图形层?

时间:2018-04-08 07:08:37

标签: java swing

我正在使用Swing开发渲染引擎。 现在我遇到了一个非常奇怪的问题。

想象一下,我们必须在Graphics2D上下文中绘制一些东西,然后清除它。我应该注意到我在BufferedImages的上下文中进行了绘制,但这并不重要,因为paintComponent()方法稍后会将该图像输出到屏幕上。 / p>

所以我应该画一些东西,然后应用一些自定义的模糊代码,然后部分重绘我的区域(我做了一个盒子阴影)。我需要使用alpha通道,以便我的图层必须能够部分透明。

现在我使用此代码重新绘制自定义图像区域:

private void repaintRegion(Graphics2D g2d, int x, int y, int w, int h, BufferedImage img) {

    g2d.clearRect(x, y, w, h);
    composite = AlphaComposite.getInstance(AlphaComposite.SRC_OUT, 1f);
    g2d.setComposite(composite);
    g2d.drawImage(img, x, y, this);

    composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f);
    g2d.setComposite(composite);

    g2d.drawImage(img, x, y, this);
}

之后就好了。但是如果我在SRC_OUT模式下删除绘画,我会得到一个黑色矩形。

但这种方式也可以正常使用:

private void repaintRegion(Graphics2D g2d, int x, int y, int w, int h, BufferedImage img) {

    AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.CLEAR, 1f);
    g2d.setComposite(composite);

    g2d.fillRect(x, y, w, h);

    composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f);
    g2d.setComposite(composite);

    g2d.drawImage(img, x, y, this);
}

有人可以解释我,为什么会这样,以及当我使用clearRect()时会发生什么?

1 个答案:

答案 0 :(得分:2)

我在我的应用程序中使用clearRect(),它运行正常。但是,我并没有搞乱上下文的复合属性。

请记住,您可能还需要确保背景颜色是透明的(我相信默认为黑色),因为clearRect()将其用作清除内容的填充颜色(请参阅https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#clearRect(int,%20int,%20int,%20int)

另外,请确保您正在使用的BufferedImage具有Alpha通道(在调用构造函数时使用带有Alpha通道的图像类型),请参阅https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#field_summary了解选项。

为了完全正确,您可以使用GraphisEnvironment构建BufferedImage

BufferedImage bufferedImage = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getDefaultScreenDevice().getDefaultConfiguration()
                .createCompatibleImage(w, h, BufferedImage.TRANSLUCENT);