我正在尝试使用Graphics2D
剪切我的RoundRectangle2D.Double
画布,但裁剪非常锯齿状且不平滑。我有以下代码来反别名:
Graphics2D g = (Graphics2D)graphics;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
我知道它有效,因为当我使用RoundRectangle2D.Double
绘制Graphics2D.fill()
时,平滑很好。如何使剪辑平滑?
注意:我知道this post,但这与JPanels
和图片有关,但我没有处理其中任何一个。我只想平滑地剪切绘图区域的一部分。
提前感谢您的帮助。
Example.java
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import javax.swing.*;
public class Example extends JPanel {
public Example() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocation(10, 10);
setPreferredSize(new Dimension(400, 400));
setBackground(Color.BLACK);
Container container = frame.getContentPane();
container.add(this);
frame.pack();
frame.setVisible(true);
}
public void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
Graphics2D g = (Graphics2D)graphics;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
RoundRectangle2D clippingArea = new RoundRectangle2D.Double(50, 50, getWidth() - 100, getHeight() -100, 40, 40);
g.setClip(clippingArea);
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
String s = "area for me to draw on where";
g.drawString(s, getWidth()/2 - g.getFontMetrics().stringWidth(s)/2, getHeight()/2 - g.getFontMetrics().getHeight());
s = "the roundrectangle should be anti-aliased";
g.drawString(s, getWidth()/2 - g.getFontMetrics().stringWidth(s)/2, getHeight()/2);
}
public static void main(String[] args) {
new Example();
}
}
答案 0 :(得分:0)
所以,根据你的例子,“简单”的答案是,作弊。
RoundRectangle2D clippingArea = new RoundRectangle2D.Double(50, 50, getWidth() - 100, getHeight() - 100, 40, 40);
// Make the clipping space rectangular
g.setClip(clippingArea.getBounds2D());
g.setColor(Color.WHITE);
g.fill(clippingArea);
g.setColor(Color.BLACK);
基本上所有这一切都使裁剪区域成矩形,然后使用RoundRectangle2D
形状填充它。
因为大多数问题都围绕边缘,这消除了核心问题,即圆边。
您可以通过不同的方式解决问题,使用中间BufferedImage
是一个(因此您可以将内容约束到指定区域,但仍然应用“软剪辑”),但对于此上下文,这将是您可以使用的最简单的解决方案