2013-09-26 218 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