修复由 2D 数组制成的 BufferedImage 的锯齿状边缘

Fix jagged edges of a BufferedImage made from 2D array

我正在尝试使用存储在二维数组中的颜色数据制作 BufferedImages。它有效,但我想知道是否有一种简单的方法来修复锯齿状的锯齿状边缘。

我猜这可能是一个 API 或一个简单的技巧,但我一直在查看许多 Java 文档都无济于事。 Vector Magic 确实可以满足我的需求,但我想学习如何自己编写代码。

如果您对 "turn on" 抗锯齿功能的快速方法感兴趣,那么您可以利用 Controlling Rendering Quality. You can pass options in the form of RenderingHints by calling Graphics2D#setRenderingHints 的 Java2D API。可用提示之一是请求抗锯齿。

以下代码示例显示 2 个 windows 都绘制了相同的圆,一个关闭了抗锯齿选项,另一个打开了抗锯齿选项。如果仔细观察,您会发现使用抗锯齿渲染提示生成的锯齿更少。

TestAntiAliasing.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestAntiAliasingPanel extends JPanel {

    private final RenderingHints rh;

    private TestAntiAliasingPanel(RenderingHints rh) {
        this.rh = rh;
    }

    @Override
    public void paint(Graphics g) {
        BufferedImage bufferedImage = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D)bufferedImage.getGraphics();
        g2.setRenderingHints(rh);
        g2.setColor(Color.BLUE);
        g2.fillOval(50, 50, 300, 300);
        g.drawImage(bufferedImage, 50, 50, this);
    }

    public static void main(String[] args) {
        createFrameWithAntiAliasingOption(false);
        createFrameWithAntiAliasingOption(true);
    }

    private static void createFrameWithAntiAliasingOption(boolean antiAliasingOption) {
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                antiAliasingOption ? RenderingHints.VALUE_ANTIALIAS_ON :
                RenderingHints.VALUE_ANTIALIAS_OFF);
        JFrame frame = new JFrame();
        frame.getContentPane().add(new TestAntiAliasingPanel(rh));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }
}

javac TestAntiAliasingPanel.java 编译,然后 运行 用 java TestAntiAliasingPanel 编译。

...but I want to learn how to code this on my own.

如果您真的有兴趣学习如何编写缓冲区操作代码以直接自己进行抗锯齿,那么这是一个需要外部研究的大课题。作为起点,Wikipedia has articles on several anti-aliasing algorithms.