如何画使用Graphics对象g的透明状?(How to draw a transparent sh

2019-06-25 02:13发布

我想创建一个“环” BufferedImage透明背景。 我可以绘制这样的透明背景的圆圈:

BufferedImage bi = new BufferedImage(d, d, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bi.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(c);
g.fillOval(0, 0, d, d);

但现在我要画一个小的透明圈在它的中间,使环(所以当我在另一个图像得出这样的图像,以及周围的环内的像素未画出)。 我想用一个Graphics对象要做到这一点,所以我可以使用抗锯齿。

这可能吗? 如果不是,它最好的方式来解决这个问题?

Answer 1:

创建一个圆形形状,然后从另一个减去圆形的形状,将其设置为夹&你可能最终需要沿着线的东西。 要隐藏剪辑的粗糙边缘,绘制形状的2px的宽行程。

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class OneRing {

    OneRing(BufferedImage imageBG, BufferedImage imageFG) {
        // presumes the images are identical in size BNI
        int w = imageBG.getWidth();
        int h = imageBG.getHeight();
        Ellipse2D.Double ellipse1 = new Ellipse2D.Double(
                w/16,h/16,7*w/8,7*h/8); 
        Ellipse2D.Double ellipse2 = new Ellipse2D.Double(
                w/4,h/4,w/2,h/2);
        Area circle = new Area(ellipse1);
        circle.subtract(new Area(ellipse2));

        Graphics2D g = imageBG.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        g.setClip(circle);
        g.drawImage(imageFG, 0, 0, null);
        g.setClip(null);
        Stroke s = new BasicStroke(2);
        g.setStroke(s);
        g.setColor(Color.BLACK);
        g.draw(circle);
        g.dispose();

        JLabel l = new JLabel(new ImageIcon(imageBG));
        JOptionPane.showMessageDialog(null, l);
    }

    public static void main(String[] args) throws Exception {
        URL urlFG = new URL("http://i.stack.imgur.com/OVOg3.jpg");
        URL urlBG = new URL("http://i.stack.imgur.com/lxthA.jpg");
        final BufferedImage biFG = ImageIO.read(urlFG);
        final BufferedImage biBG = ImageIO.read(urlBG);
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new OneRing(biBG, biFG);
            }
        });
    }
}


Answer 2:

你可以不画透明的形状。 在大多数图形API的,包括了Java 2D,当你的东西上面绘制的图形上下文“混合”用新的现有像素。 你应该找一个混合模式实现你在找什么。 混合在java中通过完成复合 。

您应该使用/实现复合执行以下操作:

result color = destination color
result alpha = destination alpha - source alpha

然后,用α= 1绘制每个像素将被共混的α-= 0和用α= 1的像素将保持不变。



文章来源: How to draw a transparent shape using a Graphics object g?