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

时间:2015-12-23 15:17:49

标签: java arrays graphics bufferedimage antialiasing

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

Anti-alias

我猜这可能有一个API或一个简单的技巧,但我一直在寻找无数的Java Docs无济于事。 Vector Magic确实做了我正在寻找的东西,但我想学习如何自己编写代码。

1 个答案:

答案 0 :(得分:3)

如果您对快速的方式感兴趣,那就打开"抗锯齿功能,那么您可以利用Controlling Rendering Quality的Java2D API。您可以通过调用RenderingHintsGraphics2D#setRenderingHints的形式传递选项。其中一个可用提示是请求抗锯齿。

以下代码示例显示了两个窗口,这两个窗口都绘制了相同的圆,一个窗口关闭了消除锯齿选项,另一个窗口打开了消除锯齿选项。如果仔细观察,您会发现使用抗锯齿渲染提示生成的那个不那么锯齿。

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运行。

  

...但我想学习如何自己编码。

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