2013-10-20 50 views
2

所以,我畫了100個同心圓。但是,當我嘗試使用Graphics2D渲染如此大量的同心圓時,它開始看起來有點模糊,而且通常沒有吸引力(請參見圖片)。改善Java Graphics2D質量

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
    g2.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
    g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
    g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
    g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 

我已經完成了所有這些東西,但這似乎是一樣好。還有什麼我可以做的,還是有另一個圖書館,可以讓我更好的結果?

Example of poor rendering.

編輯:這是全部由fillOval方法來完成。類似於:

for (int i = 0; i < 100; i++) { 
    x = getX(i); 
    y = getY(i); 
    length = getLength(i); 
    g2.fillOval(x,y,length,length); 
} 
+1

那像灼傷我的眼睛:o出於好奇, 你爲什麼做這個? – Doorknob

+0

這只是一個...實驗... – user1875290

+1

爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

2

您看到的斑點是具有多邊形邊緣的多個對象的抗鋸齒繪圖的人工痕跡。由於你沒有顯示getLength(i)正在做什麼,我不確定,但它看起來像你有多個圓圈非常接近或相同的半徑,但不同的顏色。

嘗試處理您的數據集(getLength(i)),以便您永遠不會畫出與上一個/下一個半徑相同的小閾值(例如0.5像素)內的圓。這將防止斑點形成。

如果您絕對需要包含所有細節,那麼我建議您切換到「程序化圖形」方法。這意味着你用你自己的代碼生成圖像:

For each (x, y) in the image bounds: 
    Compute distance from center 
    Find which circles the distance ± 1 pixel is touching 
    Set pixel (x, y) to the weighted average of the colors of those circles based on how much of each circle fills the pixel 

這將產生一個「完美」的圖像,而不過度消耗假象。這實際上是重新實現了抗鋸齒圓圖,但同時考慮了所有的圓,而不是一次一個。

(請注意,您可以通過計算像素只有圓的1/8和鏡像/旋轉它覆蓋整個圖像使這更有效。)

+0

聽起來很有趣。我會看看這兩種方法,但切換到程序化圖形聽起來可能是好的。 – user1875290

+0

因此,我使用了程序圖形的組合,並從圖像中刪除了長度相等的任何長度,現在看起來非常完美。謝謝您的幫助。 – user1875290