【问题标题】:Wierd anti-aliasing in java graphicsjava图形中奇怪的抗锯齿
【发布时间】:2015-10-02 11:18:59
【问题描述】:

我遇到了这种奇怪的抗锯齿:

左边的形状和右边的形状完全共享曲线部分。但是,会出现一条黑色曲线并中断绘图和颜色的平滑度。这是一个示例,旨在显示问题。

起初,用不同的颜色,我以为是错觉,(打开和关闭下面注释的 CHECK_# 行)。但是当使用相同的颜色时,就会发生这种情况。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class darkBorders extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.BLACK);
        //g2.setColor(Color.WHITE); //CHECK_1
        g2.fill(g2.getClip());

        int r = 100;

        g2.translate(this.getWidth() / 2 - r, this.getHeight() / 2 - r);

        Path2D p = new Path2D.Double();
        p.moveTo(0, 0);
        p.lineTo(r, 0);
        p.quadTo(2 * r, r, r, 2 * r);
        p.lineTo(0, 2 * r);
        p.closePath();
        g2.setColor(new Color(0xFF9900));
        //g2.setColor(new Color(0x00CC66));  //CHECK_2
        g2.fill(p);

        p.reset();
        p.moveTo(2 * r, 0);
        p.lineTo(r, 0);
        p.quadTo(2 * r, r, r, 2 * r);
        p.lineTo(2 * r, 2 * r);
        p.closePath();
        g2.setColor(new Color(0xFF9900));
        g2.fill(p);


        g2.dispose();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setContentPane(new darkBorders());
        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

有什么办法可以解决这个问题吗? 非常感谢。

【问题讨论】:

  • 首先使用double 值作为您的坐标。接下来,不要使用fill(clip),剪辑矩形不会总是匹配组件坐标空间(已翻译)。将面板的backgroundColor 设置为BLACK 并简单地调用super.paintComponent 并让它填充背景
  • 感谢您的建议,它们总是很有帮助。这是显示问题的示例代码。 Path2D 接受浮点值和十进制值,因此使用整数值并在最后将它们转换为双精度值。
  • 我以2d 为例,虽然它不能直接解决问题,但它使它变得更好。我还使用了 BasicStroke 设置为大约 1.5f 这似乎有所作为

标签: java swing paintcomponent graphics2d antialiasing


【解决方案1】:

除了fill(填充内部)之外,还有一个draw(绘制轮廓)。 我如履薄冰,但你可以用笔画宽度做点什么。

【讨论】:

  • 我试过了,但它会使形状变厚,并且在显示区域时不适用于 alpha 颜色。它在其他绘图应用程序(Flash、AI)上运行良好,但对于 java,这就是我得到的。
  • 虽然目前我使用这个技巧,但我想找到答案。
  • 可能是g.setStroke(new BasicStroke(0));?可疑,但应该将笔画宽度设置为 0。恕我直言,抗锯齿似乎是问题所在;首先在黑色背景上,然后在橙色和黑色背景之间。因此我想出了一个draw
  • new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND) 对我有用。它覆盖了形状的外部和内部部分的一些区域。值 0 没有区别,因为它是设备支持的最小可见线。顺便说一句,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2014-07-14
  • 2014-02-18
  • 1970-01-01
  • 2014-12-04
相关资源
最近更新 更多