在 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);
}
很难理解这是怎么回事。
- 为什么
g2D.setRenderingHint
解决了我的模糊问题,但我没有用它来绘制我的字符串?
but i dont use it to paint my string?
你为什么这么认为?因为,你真的在用。
如今,Graphics 始终是 Graphics2D 对象,因此您的 if 语句将被执行。
g2D
和 graphicsObject
都指向同一个对象。对于编译器来说它们是两个不同类型的变量,允许调用不同的方法,但是在执行时,这两个变量实际上指向同一个对象。
因此,通过在 g2D
上设置渲染提示,并且这是与 graphicsObject
相同的对象,绘制字符串会遵循该提示并通过使用在提示。
首先,这个修复的不是模糊的。这是别名。
当绘图函数尝试使用光栅图像(像素矩阵,即正方形)创建曲线形状时,会出现混叠。如果线条不是垂直或水平的,您最终会得到 "stairs" - 锯齿状的边缘。
抗锯齿是一种通过在绘制的线条周围使用附加像素(在前景和背景之间以不同色调绘制)来使这种效果不那么明显的方法。这会欺骗我们的眼睛,让我们的眼睛看到这条线是 "smooth"。如果缩放使用抗锯齿绘制的图像,您可能会注意到实际线条周围的那些像素。
所以,实际上,抗锯齿模糊了线条,这让我们的眼睛看起来更平滑。
至于你的实际问题 - 你正在使用图形对象来画线。您可以通过以 Graphics2D
形式访问对象来在图形对象中设置提示。即使您随后继续使用 graphicsObject
并使用其常规 Graphics
引用,方法 drawString()
也会被覆盖。这意味着它将在实现它的具体对象中被激活,它看到并使用存储提示的 RenderingHint
哈希映射。
我想知道为什么在我的框架中显示文本必须如此模糊,我偶然发现了这段代码,它正在运行
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);
}
很难理解这是怎么回事。
- 为什么
g2D.setRenderingHint
解决了我的模糊问题,但我没有用它来绘制我的字符串?
but i dont use it to paint my string?
你为什么这么认为?因为,你真的在用。
如今,Graphics 始终是 Graphics2D 对象,因此您的 if 语句将被执行。
g2D
和 graphicsObject
都指向同一个对象。对于编译器来说它们是两个不同类型的变量,允许调用不同的方法,但是在执行时,这两个变量实际上指向同一个对象。
因此,通过在 g2D
上设置渲染提示,并且这是与 graphicsObject
相同的对象,绘制字符串会遵循该提示并通过使用在提示。
首先,这个修复的不是模糊的。这是别名。
当绘图函数尝试使用光栅图像(像素矩阵,即正方形)创建曲线形状时,会出现混叠。如果线条不是垂直或水平的,您最终会得到 "stairs" - 锯齿状的边缘。
抗锯齿是一种通过在绘制的线条周围使用附加像素(在前景和背景之间以不同色调绘制)来使这种效果不那么明显的方法。这会欺骗我们的眼睛,让我们的眼睛看到这条线是 "smooth"。如果缩放使用抗锯齿绘制的图像,您可能会注意到实际线条周围的那些像素。
所以,实际上,抗锯齿模糊了线条,这让我们的眼睛看起来更平滑。
至于你的实际问题 - 你正在使用图形对象来画线。您可以通过以 Graphics2D
形式访问对象来在图形对象中设置提示。即使您随后继续使用 graphicsObject
并使用其常规 Graphics
引用,方法 drawString()
也会被覆盖。这意味着它将在实现它的具体对象中被激活,它看到并使用存储提示的 RenderingHint
哈希映射。