gpt4 book ai didi

java - 如何修复 Java 图形中的文本质量?

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:13 24 4
gpt4 key购买 nike

代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JFrame;

public class TextRectangle extends JFrame {

private static final long serialVersionUID = 1L;

public static void main(String[] a) {
TextRectangle f = new TextRectangle();
f.setSize(300, 300);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(
RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);

g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());

g2d.setColor(Color.BLACK);
g2d.setFont(new Font("Calibri", Font.BOLD, 18));
g2d.drawString("Why does this text look so ugly?", 30, 150);
}

}

结果:

result screenshot

如您所见,字母间距不均匀。有时是 1px,有时是 2 甚至 3 像素。另一个问题是“i”上方的点比底部宽。

problem details

在文本编辑器中编写的相同文本看起来要好得多。你知道如何解决这个问题吗?

我的环境是Windows 8.1,Java 1.8。

最佳答案

图形上下文默认使用整数度量 - 这意味着舍入应用于字形的位置 vector 。

您可以使用以下方式切换到分数指标:

g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);

enter image description here

如您所见,没有使用子像素抗锯齿(仅灰色抗锯齿像素)。您可以启用子像素抗锯齿以在 LCD 屏幕上获得更好的可读性:

g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

enter image description here

有4种模式:

  • VALUE_TEXT_ANTIALIAS_LCD_HRGB:水平方向的 RGB
  • VALUE_TEXT_ANTIALIAS_LCD_HBGR:水平方向的 BGR
  • VALUE_TEXT_ANTIALIAS_LCD_VRGB:垂直方向的 RGB
  • VALUE_TEXT_ANTIALIAS_LCD_VBGR:垂直方向的 BGR

我还没有找到在哪里查询当前显示和方向的适当值。一些显示器可以倾斜(横向/纵向)甚至旋转,需要在绘画时重新检测模式。

编辑

我在 Filthy Rich Clients 中找到了一些东西书:显然,Java AWT 工具包可以提供适当的呈现提示:

Map<?, ?> desktopHints = 
(Map<?, ?>) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints");

Graphics2D g2d = (Graphics2D) g;
if (desktopHints != null) {
g2d.setRenderingHints(desktopHints);
}
// no need to set more rendering hints

在我的系统上,这会使用分数度量和 LCD HRGB 抗锯齿渲染文本,与上面的代码相同。我系统上的提示是:

  • 文本特定的抗锯齿启用键:LCD HRGB 抗锯齿文本模式
  • 文本专用 LCD 对比度键:120

关于java - 如何修复 Java 图形中的文本质量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com