2013-09-26 28 views
1

我有问题应该很简单。我正在绘制1%不透明的盒子。经过100次涂料后,我预计不透明度会达到100%,但不透明度(alpha值)会收敛到100%以下,并停止增加。为了说明这个问题,我已经简化了我的代码如下:AlphaComposite - 阿尔法值收敛

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%不透明度)的字母相叠然后测试在绘图区域的中心阿尔法是什么。我认为这应该像这样增加:0%,1%,2%,3%... 100%。然而,相反,它慢慢收敛到83.5%,并且停止增长奇怪。我认为这与AlphaComposite有关,但尝试不断地尝试找到一种简单的线性alphaNEW = alphaDST + alphaSRC操作而没有成功的方法。然而,0.5或更高的α在中心处达到1.0,尽管不是我想要的线性。所有的复合材料似乎都使用格式“alpha”和/或“1-alpha”作为源和目标像素......任何想法?

干杯:)

编辑:我想要达到的目的是什么线性(1%,2%,3%的不透明度...)并没有什么不同,如果你画一样的Photoshop将如何运作面积反复使用1%不透明油漆,最终达到100%不透明度,但不会停止在80%!

+0

您是否尝试将['RenderingHints.KEY_ALPHA_INTERPOLATION'](http://docs.oracle.com/javase/7/docs/api/java/awt/RenderingHints.html#KEY_ALPHA_INTERPOLATION)设置为“VALUE_ALPHA_INTERPOLATION_QUALITY”(使用'g2.setRenderingHint(...)'?可能是舍入错误,不确定它是否有效果,但值得探讨。 – haraldK

回答

1

默认情况下,Alpha堆肥不是“添加剂”。通常,最终的alpha值是作为'in'运算符计算的。 wiki有更多关于此的信息。但是,如果你想添加堆肥,你可能不得不实施你自己的custom composting function