bufferedimage对象的透明度

Gab*_*lla 2 java bufferedimage

我注意到当我用Color(0,0,0,0)绘制一些东西时,它在另一个图像上,所显示的颜色是JFrame背景,而不是它下面的图像.

帮助我找到解决方案的原因是什么?

谢谢!!

编辑:看到圆圈,灰色区域(角落)应该是透明的,但不是,它们是JFrame的颜色. 替代文字http://img72.imageshack.us/img72/9657/transparency.png

以下是绘制圆圈的代码:

public void paint(final Graphics g) {
        super.paintComponent(g);
        final Graphics2D g2 = (Graphics2D) g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        if (unitImage == null) {

            unitImage = (BufferedImage) (createImage(30, 30));
            final Graphics2D gc = unitImage.createGraphics();
            gc.setRenderingHints(rh);
            gc.setColor(outsideColor);
            gc.fillOval(0, 0, diameter, diameter);
            gc.setColor(middleColor);
            gc.fillOval(diameter / 6, diameter / 6, (diameter / 3) * 2, (diameter / 3) * 2);
            gc.setColor(innerColor);
            gc.fillOval(diameter / 3, diameter / 3, diameter / 3, diameter / 3);
        }

        g2.drawImage(unitImage, null, 0, 0);

一直在玩Alphacomposites,我认为它不是解决方案.所以我添加了所有这些新信息,我相信,这将帮助你们给我另一个提示.

Chu*_*Lee 7

你画之前是否设置了AlphaComposite?

Graphics2D g2d = (Graphics2D)g; //Some graphics object
//Save the original
Composite original = g2d.getComposite();
//Set to semi translucent
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
g2d.setComposite(translucent);

//Draw

//Set back to original
g2d.setComposite(original);
Run Code Online (Sandbox Code Playgroud)

免责声明:代码说明测试


tra*_*god 6

@Chuk Lee是对的:除非你改变它,否则默认Graphics2D复合是AlphaComposite.SrcOver.这个方便的工具显示所选规则和指定颜色和alpha对的复合结果.

附录:一种方法是覆盖paintComponent()并渲染地图和圆圈,但您可以通过清除alpha来使角落透明:

...
gc.setRenderingHints(rh);
gc.setComposite(AlphaComposite.Clear);
gc.fillRect(0, 0, diameter, diameter);
gc.setComposite(AlphaComposite.Src);
gc.setColor(outsideColor);
...
Run Code Online (Sandbox Code Playgroud)

createImage(30, 30)关系diameter吗?您覆盖paint()和调用哪个组件super.paintComponent(g)