【问题标题】:How to fit font into pixel size in Java? How to convert pixels to points?如何在Java中将字体适合像素大小?如何将像素转换为点?
【发布时间】:2013-07-07 06:07:27
【问题描述】:

我需要以像素为单位创建给定大小的字体。

Java 的Font 类构造函数需要以磅表示的字体大小。点是物理长度,而像素是数字化的。所以我需要dpi

手册上说,这个值包含在FontRenderContext.getTransform()中。

我发现,就我而言,缩放是一,即像素 = 点。

不幸的是,创建大小为 100 的字体会创建更大的图像。

例如下面的代码

    BufferedImage ans = new BufferedImage(width, height, imageType);
    Font font = new Font(fontName,fontStyle,height);

    Graphics2D g2 = ans.createGraphics();

    g2.setFont(font);

    FontMetrics fm = g2.getFontMetrics();
    FontRenderContext frc = g2.getFontRenderContext();

    System.out.println("height=" + height);
    System.out.println("frc.getTransform()=" +frc.getTransform());
    System.out.println("g2.getTransform()=" +g2.getTransform());
    System.out.println("fm.getAscent()+fm.getDescent()="+fm.getAscent()+"+"+fm.getDescent()+"="+(fm.getAscent()+fm.getDescent()));


    g2.drawString(str, 0, fm.getAscent());

给予

height=100
frc.getTransform()=AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
g2.getTransform()=AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
fm.getAscent()+fm.getDescent()=93+20=113

如何搭配?

【问题讨论】:

  • 一英寸有 72 个点。台式电脑显示器一般为 96 像素到英寸。您可以调用 Toolkit.getDefaultToolkit().getScreenResolution();以每英寸像素为单位获取屏幕分辨率。
  • 在我的例子中,分辨率是每点 1 个像素(参见变换对象)。或者你的意思是即使我不使用屏幕,屏幕分辨率也会在这里起作用?

标签: java graphics fonts awt


【解决方案1】:

在绘制字符串时,我已使用此代码确定字符串的大小(以像素为单位)。

x 和 y 计算使绘图区域中的字符串居中。 y 计算看起来很奇怪,因为 y 原点在左下角,而不是左上角。

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    if (font == null) {
        return;
    }

    Graphics2D g2d = (Graphics2D) g;
    FontRenderContext frc = g2d.getFontRenderContext();
    TextLayout layout = new TextLayout(sampleString, font, frc);
    Rectangle2D bounds = layout.getBounds();

    int width = (int) Math.round(bounds.getWidth());
    int height = (int) Math.round(bounds.getHeight());
    int x = (getWidth() - width) / 2;
    int y = height + (getHeight() - height) / 2;

    layout.draw(g2d, (float) x, (float) y);
}

【讨论】:

  • 这看起来是反向任务。我需要创建正确的Font 实例,知道像素大小。
  • @Suzan Cioc:将上面的代码放在一个循环中。从 72 像素的字体大小开始,然后递减 2,直到文本适合您的像素区域。
【解决方案2】:
// using javafx: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/text/package-summary.html 
Text text = new Text("Hello World");
Font font = Font.font("Arial", 10); // 10 is point size
text.setFont(font);
double width = text.getLayoutBounds().getWidth(); // width is pixel size

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多