因此,我正在绘制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);
 }

最佳答案

您所看到的斑点是边缘相互靠近的多个对象的抗锯齿图的伪像。由于您没有显示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的像素并将其镜像/旋转以覆盖整个图像来提高效率)。

10-05 21:44