Java:获取具有特定高度(以像素为单位)的字体

Ton*_*ony 6 java fonts graphics2d fontmetrics

使用时很容易确定字体的渲染高度FontMetrics,但另一种方法呢?如何获得适合特定高度(以像素为单位)的字体?

"给我Verdana一个从上升到下降30像素高的大小."

我如何向Java询问此问题?

cor*_*ttk 6

仁,

我不认为有一种"直接"的方式来找到一个字体的高度; 只是间接的方式...通过循环大小,并测试每个的高度<=所需的高度.

如果你这样做一次,只需循环它们......如果你"在飞行中"这样做,那么进行二分搜索,它会更快.

干杯.基思.


Mar*_* A. 6

我知道这是一个非常古老的问题,但有人可能仍然会发现它:

Java(以及许多其他地方)中的字体高度在"印刷点"中给出,其被定义为大约1/72英寸.

要计算某个像素高度所需的点,您应该能够使用以下内容:

double fontSize= pixelSize * Toolkit.getDefaultToolkit().getScreenResolution() / 72.0;
Run Code Online (Sandbox Code Playgroud)

我还没有对此进行过广泛的测试,但它似乎适用于我使用过的显示器.如果我找到一个不起作用的情况,我会报告回来.

对于我用过的标准系统字体,这会将大写字母(即上升)的高度设置为提供的像素大小.如果需要将ascent + descent设置为像素大小,可以使用FontMetrics更正值:

FontMetrics m= g.getFontMetrics(font); // g is your current Graphics object
double totalSize= fontSize * (m.getAscent() + m.getDescent()) / m.getAscent();
Run Code Online (Sandbox Code Playgroud)

当然,某些特定字母的实际像素高度将取决于所使用的字母和字体,因此如果您想确保"H"是一些确切的高像素数,您可能仍希望使用该试用版其他答案中提到的错误方法.请记住,如果您使用这些方法来获取要显示的每个特定文本的大小(如@Bob建议的那样),您可能会在屏幕上出现随机字体大小的混乱,其中包含"ace"等文本"会有比"标签"更大的字母.为了避免这种情况,我会选择一个特定的字母或字母序列("T"或"Tg"或其他东西)并将其固定到像素高度一次,然后使用从中到处获得的字体大小.


Whi*_*g34 5

我不知道如何通过其实际高度(以像素为单位)获取字体.这取决于它所使用的上下文,所以可能没有比最佳匹配样本更短的方式.从设计高度向上或向下寻找尺寸应该非常快.这是一个执行此操作的示例方法:

public Font getFont(String name, int style, int height) {
    int size = height;
    Boolean up = null;
    while (true) {
        Font font = new Font(name, style, size);
        int testHeight = getFontMetrics(font).getHeight();
        if (testHeight < height && up != Boolean.FALSE) {
            size++;
            up = Boolean.TRUE;
        } else if (testHeight > height && up != Boolean.TRUE) {
            size--;
            up = Boolean.FALSE;
        } else {
            return font;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)