java - 基于内容估计文本宽度的算法

标签 java algorithm text

这是一个远景,但有谁知道根据其内容估计和分类文本宽度(对于可变宽度字体)的算法?

例如,我想知道 iiiiiiii 不如 abcdefgh 宽,而 abcdefgh 又不如 WWWWWWWW,即使所有三个字符串的长度都是八个字符。

这实际上是尝试将一些智能构建到字符串截断方法中,目前它正确地截断了视觉上较宽的字符串,但也不必要地截断了视觉上较窄的字符串,因为两个字符串包含相同数量的字符。算法将输入字符串分类为narrownormalwide,然后适当截断可能就足够了。

这个问题并不是真正特定于语言的,但是如果有算法那么我会用 Java 实现它。这适用于 Web 应用程序。我知道 SO 上有一些答案可以使用 JavaScript 获取包含的 div 元素的宽度来处理这个问题,但我想知道服务器端解决方案是否可行。

最佳答案

大多数 GUI 框架都提供了一些方法来计算给定输出设备上字体的文本规范。

例如使用java.awt.FontMetrics,我相信你可以做到:

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics; 

public int measureText(Graphics g, String text) {
   g.setFont(new Font("TimesRoman", Font.PLAIN, 12));
   FontMetrics metrics = g.getFontMetrics();

   return metrics.stringWidth(text);
}

未经测试,但您明白了。


在 .Net 下,您可以使用 Graphics.MeasureString方法。在 C# 中:

private void MeasureStringMin(PaintEventArgs e)
{

    // Set up string.
    string measureString = "Measure String";
    Font stringFont = new Font("Arial", 16);

    // Measure string.
    SizeF stringSize = new SizeF();
    stringSize = e.Graphics.MeasureString(measureString, stringFont);

    // Draw rectangle representing size of string.
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height);

    // Draw string to screen.
    e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0));
}

关于java - 基于内容估计文本宽度的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803109/

相关文章:

java - 如何轮询目录而不遇到文件传输竞争条件?

Java树生成广度优先?

python - 关闭程序后不保存文本文件

java - 如何从java中的光栅图像获取byte[]?

java - 如何获取swing中的组件名称?

Java AES 加密无法正确解密

sql-server - 查询集封面

algorithm - 具有给定纵横比的 TreeMap

python 文件操作(bash 脚本移植)

C++追加到文件的第二行