为什么没有适当的抗锯齿渲染这条线?

Rog*_*ach 20 java swing

我正在尝试渲染一条线,但是如果线条在真正的画布边界之外开始,我会遇到奇怪的行为.

例如,我有时会得到这个图像而不是正确的行:

在此输入图像描述

正确的行看起来像这样:

在此输入图像描述

以下是生成此示例的可运行代码:

import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.*;
import java.awt.geom.*;

public class Render {
    public static void main(String[] args) throws Exception {
        BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) image.getGraphics();

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 100, 100);

        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(2));
        g.draw(new Line2D.Double(-92, 37, 88, 39));

        g.dispose();
        ImageIO.write(image, "png", new File("output.png"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用许多不同的渲染提示,但没有组合摆脱这个问题.可能是罪魁祸首?

编辑:

这是RenderingHints.VALUE_STROKE_NORMALIZE的图像:

在此输入图像描述

缩放版图像(g.scale(10,10)):

在此输入图像描述

Rob*_*bAu 6

我认为这是算法中的一个错误,与启动画布有关.(我是这样向Oracle提交的(评论ID:JI-9026491,Oracle Bug数据库:JDK-8146312))

请参阅此示例(Ubuntu 14.04,Java 8u66):

在此输入图像描述

如果我反转y坐标:

在此输入图像描述

最后一个考试:

在此输入图像描述

import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.*;
import java.awt.geom.*;

public class Testing {
    public static void main(String[] args) throws Exception {

        BufferedImage image = new BufferedImage(400, 400, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) image.getGraphics();

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 400, 400);

        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(2));
        for (int i=0; i<400; i+=5)
        {
            double dy = 8.0*(i-100.0) / 200.0;
            g.setColor(Color.BLACK);
            g.draw(new Line2D.Double(-100, dy+i, 90, i));
            g.draw(new Line2D.Double(200+-100, dy+i, 200+90, i));
        }

        g.dispose();
        ImageIO.write(image, "png", new File("output.png"));
    }
}
Run Code Online (Sandbox Code Playgroud)