java - 提高 Java Graphics2D 质量

标签 java awt java-2d graphics2d

所以,我正在画 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);

我已经完成了所有这些事情,但这似乎已经是最好的了。我还能做些什么,或者还有其他图书馆可以给我带来更好的结果吗?

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);
 }

最佳答案

您看到的 Blob 是多个边缘靠近的对象的抗锯齿绘制的伪影。由于您没有显示 getLength(i) 正在做什么,所以我不确定,但看起来您有多个半径非常接近或相同但颜色不同的圆。

尝试处理您的数据集 (getLength(i)),以便您永远不会绘制与上一个/下一个半径相同的小阈值(例如 0.5 像素)内的圆一。这将防止 Blob 的形成。

如果您绝对需要包含所有细节,那么我建议您切换到“程序图形”方法。这意味着您使用自己的代码生成图像:

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 圆的像素并镜像/旋转它以覆盖整个图像来提高效率。)

关于java - 提高 Java Graphics2D 质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483834/

相关文章:

java - 带有 Spring 的 ehcache。找不到谷歌代码 xsd 文件

java - 如何将 JavaFX 与 Java Swing 应用程序集成?

java - 如何在 ATG 存储库结构中表示 Oracle View

java - 无法通过 Android 从另一台 Android 设备接收 UDP 数据包

Java 2D 绘图最佳性能

java - Rectangle.intersection(Rectangle) 返回宽度和高度为负的矩形

java - 在java中操作GUI对象

java - 如何获取不同文件的缩略图?

java - 是否可以检测窗口遮挡

java - 将组件绘制到 BufferedImage 会导致显示损坏