我正在尝试使用存储在2D阵列中的颜色数据制作BufferedImages。它有效,但我想知道是否有一种简单的方法来修复锯齿状的锯齿状边缘。
我猜这可能有一个API或一个简单的技巧,但我一直在寻找无数的Java Docs无济于事。 Vector Magic确实做了我正在寻找的东西,但我想学习如何自己编写代码。
答案 0 :(得分:3)
如果您对快速的方式感兴趣,那就打开"抗锯齿功能,那么您可以利用Controlling Rendering Quality的Java2D API。您可以通过调用RenderingHints
以Graphics2D#setRenderingHints
的形式传递选项。其中一个可用提示是请求抗锯齿。
以下代码示例显示了两个窗口,这两个窗口都绘制了相同的圆,一个窗口关闭了消除锯齿选项,另一个窗口打开了消除锯齿选项。如果仔细观察,您会发现使用抗锯齿渲染提示生成的那个不那么锯齿。
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。