尽管有抗锯齿,剪切也是锯齿状的

时间:2018-02-18 06:47:28

标签: java graphics graphics2d clip

我正在尝试使用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();
    }
}

1 个答案:

答案 0 :(得分:0)

所以,根据你的例子,“简单”的答案是,作弊。

Soft clipping

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是一个(因此您可以将内容约束到指定区域,但仍然应用“软剪辑”),但对于此上下文,这将是您可以使用的最简单的解决方案