java - Graphics2D 无法显示 alpha?

标签 java bit-manipulation bufferedimage alpha graphics2d

我正在我的 2D 引擎中实现图层,我希望图层可以堆叠,并且我还想要一个在图层中“切洞”的功能 - 这意味着使用 alpha。然而,当独立编写它时,我似乎无法得到任何东西来使用真正的阿尔法,它试图通过将颜色混合在一起来伪造它,例如(我的代码):

BufferedImage background, foreground;
public GraphicsTest() {
    background = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);
    foreground = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB);  // Fully capable of alpha.
    Random r = new Random();
    int white = Color.white.getRGB();
            // Draw random white dots
    for (int i=0; i<500; i++) {
        int
        x = r.nextInt(500),
        y = r.nextInt(500);
        background.setRGB(x, y, white);
    }
}

@Override
protected void paintComponent(Graphics g) {
    BufferedImage output = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB); // Fully capable of alpha.
    Graphics2D canvas = output.createGraphics();
    Graphics2D overlay = foreground.createGraphics();

    canvas.drawImage(background, 0, 0, null);

    overlay.setColor(Color.white);
    overlay.fillRect(0, 0, 500, 500);
            // Start drawing with alpha
    overlay.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
    overlay.setColor(new Color(0xFF000000)); // Overwrite/draw full alpha, colour doesn't matter when alpha is 100%
    overlay.fillRect(100, 100, 125, 87);

    //canvas.setColor(Color.red);
    //canvas.fillRect(0, 0, 500, 500);
    canvas.drawImage(foreground, 0, 0, null);
    overlay.dispose();
    canvas.dispose();
    g.drawImage(output, 0, 0, null);
            // Also write to a file for manual raw pixel checking
    try {
                    // Does output a 32-bit depth image
        ImageIO.write(output, "PNG", new File("c:/output.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我能想到的最基本的测试,我有两张图像,一张用于背景,一张用于前景,我需要在 127x87(随机大小)框中通过前景查看背景。 目前它会导致白屏和黑框,后框应该是背景的那部分。

我在这里尝试了各种方法,设置合成并用完整的alpha绘制黑色,但是当组合起来时我从来没有看到背景,setColor(0xFF000000)似乎除了绘制黑色之外没有做任何事情,并且合成是这种“伪造”的罪魁祸首不是在 00FFFFFF(没有 alpha 的白色)背景上覆盖 FF000000(黑色),而是生成 FF000000(我设置的值),而是 007F7F7F(没有 alpha 的灰色)。

我能看到这一点的唯一原因是一切都通过 Graphics2D 对象进行,我不能使用 output.setRGB 因为它很慢而且我不知道如何用它绘制自定义形状。

最佳答案

您需要更改 3 处内容才能使代码正常运行。

正如@vandale所说,您需要通过 boolean 构造函数使用具有实际alpha的颜色。 其次,alpha 是不透明度(因此对于透明颜色,它应该为 0)。你得到:

 overlay.setColor(new Color(0x0000000, true));

第三,你需要说你的绘画操作实际上会覆盖已经存在的任何内容(你不想在现有的顶部(ATOP)绘制,而是用透明颜色(IN)替换那里的内容) 。你得到:

 overlay.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 1f));

关于java - Graphics2D 无法显示 alpha?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19746537/

相关文章:

java - “overriding” java中具有向上转换调用的私有(private)方法

java - 使用java保存时图像会改变颜色

java - 将 BigDecimals 列表与特定值进行比较并返回最接近的值

go - 在 Go 中将 uint16 转换为 int16 的正确方法

c - 字节中的位反转如何工作?

dart - 如何在字节数据序列的387位偏移处将5位设置为值3?

java - 如何创建将缓冲图像旋转 90 度的反转?

java - PaintComponent 中的 BufferedImage 始终为 null

java - JSF 在 h :message 中显示抛出的消息

java - Extjs 6 + Spring 休息 : Empty response for 401 error