所以,我画的是100个同心圆。然而,当我尝试用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);
我已经做了所有这些事情,但这似乎和它一样好。还有什么我可以做的,还是有另一个图书馆可以让我得到更好的结果?
编辑:这都是由fillOval方法完成的。类似的东西:
for (int i = 0; i < 100; i++) {
x = getX(i);
y = getY(i);
length = getLength(i);
g2.fillOval(x,y,length,length);
}
答案 0 :(得分: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并镜像/旋转它来覆盖整个图像来提高效率。)