Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 是否可以在BuffereImage中的其他像素顶部不透明地绘制一条半透明颜色的线?_Java_Graphics2d - Fatal编程技术网

Java 是否可以在BuffereImage中的其他像素顶部不透明地绘制一条半透明颜色的线?

Java 是否可以在BuffereImage中的其他像素顶部不透明地绘制一条半透明颜色的线?,java,graphics2d,Java,Graphics2d,我试着准备一个半透明的BuffereImage,这样无论在什么地方,背景上绘制的图像都会部分地发光。为此,我使用了笔划大于1的Graphics.drawLine()和alpha分量小于255的颜色,即半透明。我画的线经常会重叠或相交,以确保没有间隙。当发生此类相交时,线条的颜色将叠加,即之前的颜色和我正在使用的半透明颜色将产生新颜色。这是合乎逻辑的 然而,这不是我想要的。如果可能的话,我想用半透明的颜色来画画,就好像它是完全不透明的,颜色的alpha分量只是第四种颜色分量。我想复制我正在绘制的颜

我试着准备一个半透明的BuffereImage,这样无论在什么地方,背景上绘制的图像都会部分地发光。为此,我使用了笔划大于1的Graphics.drawLine()和alpha分量小于255的颜色,即半透明。我画的线经常会重叠或相交,以确保没有间隙。当发生此类相交时,线条的颜色将叠加,即之前的颜色和我正在使用的半透明颜色将产生新颜色。这是合乎逻辑的

然而,这不是我想要的。如果可能的话,我想用半透明的颜色来画画,就好像它是完全不透明的,颜色的alpha分量只是第四种颜色分量。我想复制我正在绘制的颜色-包括alpha组件-精确到图像,替换之前的所有内容

有办法做到这一点吗

下面的代码生成一个简单的半透明的红色X,它将使背景部分地通过绘制在顶部的任何地方。然而,它将有一个较暗的部分,两条线相交。我想能够画X没有这个黑暗的部分。这可能吗(仍然使用Graphics.drawLine())

当然,我可以通过实现自己的线条绘制方法手动解决这个问题,并直接操作像素。(不确定这是否会给剪辑带来新的问题,我也需要这样做。)然而,这将大大增加我希望避免的工作量

另一个限制:我仅限于Java 7。

  • 创建第二个图像
  • 用不透明的颜色绘制第二幅图像
  • 使用半透明alpha将第二个图像复制到原始图像上


也许画三条线而不是两条。在相反方向画一条长对角线和两条短对角线。这样线就不会重叠了。只是一个建议:-)对于这个具体的例子,这将是有效的,是的,但不是一般的。我想在我不知道的地方画一些线,在我不知道的地方画一些其他的东西。使用第二张图片的想法很有趣。我也不知道AlphaComposite的存在,谢谢你让我注意到这一点。不幸的是,该类的文档对我来说有点不可访问。我是否正确理解/猜测您在这里使用的类是一个全局操作,它以相同的方式影响每个像素?这显然解决了我的例子。但我希望能够用不同的alpha值绘制线条。不过,使用第二个图像可能会以稍微不同的方式受益。我也许可以在两个不同的图像上画相同的线,在一个不透明的图像上,完全按照你的建议,在第二个图像上,alpha值可以画成红色,例如。在第二步中,两个图像可以再次组合,并且第二个图像的红色被转换回第一个图像的alpha值。我必须想一想,测试一下,看看是否可以这样做。如果是这样,那要感谢你的投入。比实现我自己的画线方法更好。我不确定你需要什么,但我怀疑你可以从第二张图像重复复制,每一次你的线可能有不透明。也就是说,如果你有一些50%alpha的线条和一些30%alpha的线条,用不透明的颜色画出50%的线条,然后像我的例子那样复制它们;然后清除次映像,用不透明的颜色绘制其他线条,并使用初始化为
0.3f
的AlphaComposite将次映像复制到主映像上。尽可能多地重复不同的不透明度。我也发现所有字母组合规则都令人畏惧。我建议在JDK的Demo/jfc/J2Ddemo目录中运行Java2D演示。(在JDK 9或10中不可用;Java 8版本是。)一旦它运行,选择“Composite”选项卡,然后通过单击它(在选项卡的右上方区域)或选择“demos.Composite.ACrules”内部选项卡放大AlphaComposite规则小窗口。它的动画大约每五秒钟循环一次。我现在意识到,我不应该把问题缩小这么多,因为它妨碍像你这样有帮助的人完全理解我需要朝哪个方向走。更广泛的问题是,我想画一条很粗的之字形线。此之字形包含从一侧到另一侧的颜色渐变(因此,不是从起点到终点,而是从左到右)。我试图通过相邻地画线来解决这个问题。笔划>1以填充间隙。只要不涉及alpha通道,该算法就可以完美工作。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;

public class Test {
    
    public static void main(String[] args) {
        // create a new BufferedImage with alpha channel
        BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = img.createGraphics();
        // set a semi-transparent color and a stroke wider than one pixel
        g.setColor(new Color(255, 0, 0, 128 /* alpha; semi-transparent */));
        g.setStroke(new BasicStroke(2));
        // draw a cross; where the lines cross the color will (logically) be darker
        g.drawLine(0, 0, 100, 100);
        g.drawLine(0, 100, 100, 0);
        // use the image somehow, in this case write it to file
        writeImage(img, "test.png");
    }
    
    private static void writeImage(BufferedImage img, String fileName) {
        try {
            ImageIO.write(img, "png", new File(fileName));
        }
        catch (IOException e) {
            System.out.println(e);
        }
    }
}
import java.io.*;
import javax.imageio.*;

public class TranslucentX {
    
    public static void main(String[] args) {
        BufferedImage x = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = x.createGraphics();
        g.setColor(new Color(255, 0, 0));
        g.setStroke(new BasicStroke(2));
        // draw a cross; where the lines cross the color will (logically) be darker
        g.drawLine(0, 0, 100, 100);
        g.drawLine(0, 100, 100, 0);
        g.dispose();

        // create a new BufferedImage with alpha channel
        BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        g = img.createGraphics();
        // Draw opaque image using translucency.
        g.setComposite(
            AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
        g.drawImage(x, 0, 0, null);
        g.dispose();

        // use the image somehow, in this case write it to file
        writeImage(img, "test.png");
    }
    
    private static void writeImage(BufferedImage img, String fileName) {
        try {
            ImageIO.write(img, "png", new File(fileName));
        }
        catch (IOException e) {
            System.out.println(e);
        }
    }
}