在 JAVA 中修复 Graphics2D 的模糊问题

fixing blurrieness with Graphics2D in JAVA

我想知道为什么在我的框架中显示文本必须如此模糊,我偶然发现了这段代码,它正在运行

public void paint(Graphics graphicsObject){
    if(graphicsObject instanceof Graphics2D){
        Graphics2D g2D = (Graphics2D) graphicsObject;       
        g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    }
    graphicsObject.drawString("not blurry text display", 200, 200);
}

很难理解这是怎么回事。

but i dont use it to paint my string?

你为什么这么认为?因为,你真的在​​用。

如今,Graphics 始终是 Graphics2D 对象,因此您的 if 语句将被执行。

g2DgraphicsObject 都指向同一个对象。对于编译器来说它们是两个不同类型的变量,允许调用不同的方法,但是在执行时,这两个变量实际上指向同一个对象。

因此,通过在 g2D 上设置渲染提示,并且这是与 graphicsObject 相同的对象,绘制字符串会遵循该提示并通过使用在提示。

首先,这个修复的不是模糊的。这是别名

当绘图函数尝试使用光栅图像(像素矩阵,即正方形)创建曲线形状时,会出现混叠。如果线条不是垂直或水平的,您最终会得到 "stairs" - 锯齿状的边缘。

抗锯齿是一种通过在绘制的线条周围使用附加像素(在前景和背景之间以不同色调绘制)来使这种效果不那么明显的方法。这会欺骗我们的眼睛,让我们的眼睛看到这条线是 "smooth"。如果缩放使用抗锯齿绘制的图像,您可能会注意到实际线条周围的那些像素。

所以,实际上,抗锯齿模糊了线条,这让我们的眼睛看起来更平滑。


至于你的实际问题 - 你正在使用图形对象来画线。您可以通过以 Graphics2D 形式访问对象来在图形对象中设置提示。即使您随后继续使用 graphicsObject 并使用其常规 Graphics 引用,方法 drawString() 也会被覆盖。这意味着它将在实现它的具体对象中被激活,它看到并使用存储提示的 RenderingHint 哈希映射。