java - AlphaComposite - alpha 值收敛

标签 java graphics bufferedimage alpha composite

我遇到了一些本来应该很简单的问题。我正在一个一个地绘制 1% 的不透明盒子。绘制 100 次后,我预计不透明度将达到 100%,但不透明度(alpha 值)收敛到 100% 以下并停止增加。为了演示这个问题,我将代码简化为:

    BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = bi.createGraphics();

    float alpha = 0.01f;
    Color c = new Color(1.0f, 1.0f, 1.0f, alpha);
    g2.setColor(c);

    while (true) {
        g2.fillRect(0, 0, 10, 10);
        System.out.println(new Color(bi.getRGB(5, 5), true).getAlpha() / 255f);
        Thread.sleep(50);
    }

它会用 0.01(1% 不透明度)的 alpha 相互绘制填充的白色框,然后测试绘图区域中心的 alpha 值。我认为应该这样增加:0%、1%、2%、3% ... 100%。然而,它却慢慢收敛到 83.5%,并奇怪地停止增长。我认为这与 AlphaComposite 有关,但我不断尝试寻找一种进行简单线性 alphaNEW = alphaDST + alphaSRC 操作的方法,但没有成功。然而,0.5 或以上的 alpha 在中心确实达到 1.0 - 尽管不像我想要的那样是线性的。所有合成似乎都使用“alpha”和/或“1 - alpha”格式作为源像素和目标像素...有什么想法吗?

干杯:)

编辑:我想要实现的是线性(1%、2%、3% 不透明度...),与 Photoshop 的操作方式没有什么不同,如果你用 1% 不透明涂料一遍又一遍地绘制同一区域,它最终会达到 100% 不透明,不会停留在 80%!

最佳答案

默认情况下,Alpha 堆肥不是“附加的”。通常,最终的 alpha 是作为“in”运算符计算的。 wiki有更多这方面的信息。但是,如果您想要添加堆肥,您可能必须实现自己的 custom composting function

关于java - AlphaComposite - alpha 值收敛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040214/

相关文章:

R/RStudio : graph scaling issues & fuzziness on high dpi screens

java - 在 Java 中将图像对象拆分为二维数组

Java:绘制缩放对象(缓冲图像和 vector 图形)

java - 尝试使用 jdbc 连接到 mysql 数据库

java - 如何模拟或将带有扫描仪输入的控制台引入 jFrame 应用程序

java - getTableCellRendererComponent 被反复调用并使 CPU 使用率达到 100%

java - 如何从文件中读取并将其存储在对象的ArrayList中?

java - 如何使用双参数的drawImage()方法

游戏循环和按钮的 Java 图形问题

Java:从 res 文件夹加载 BufferedImage