Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用图形对象g绘制透明形状?_Java_Image_Graphics_Awt_Java 2d - Fatal编程技术网

Java 如何使用图形对象g绘制透明形状?

Java 如何使用图形对象g绘制透明形状?,java,image,graphics,awt,java-2d,Java,Image,Graphics,Awt,Java 2d,我想在buffereImage中创建一个透明背景的“环”。我可以画一个透明背景的圆圈,如下所示: BufferedImage bi = new BufferedImage(d, d, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D) bi.getGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS

我想在
buffereImage
中创建一个透明背景的“环”。我可以画一个透明背景的圆圈,如下所示:

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
对象来执行此操作,以便使用抗锯齿


这可能吗?如果不是,解决这个问题的最佳方法是什么

不能绘制透明形状。在Java 2D中包含的大多数图形API中,当您在某个对象上绘制时,图形上下文将现有像素与新像素“混合”。你应该找到一个混合模式,实现你所寻找的。java中的混合是通过

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

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

然后,使用alpha=1绘制的每个像素将混合为alpha=0,而使用alpha=1绘制的像素将保持不变。

创建一个圆形,然后从中减去另一个圆形,将其设置为剪辑&最终可能会得到所需线条上的某些东西。要隐藏剪辑的粗糙边缘,请绘制一个2倍宽的形状笔划

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);
            }
        });
    }
}