这是一个远景,但有谁知道根据其内容估计和分类文本宽度(对于可变宽度字体)的算法?
例如,我想知道 iiiiiiii 不如 abcdefgh 宽,而 abcdefgh 又不如 WWWWWWWW,即使所有三个字符串的长度都是八个字符。
这实际上是尝试将一些智能构建到字符串截断方法中,目前它正确地截断了视觉上较宽的字符串,但也不必要地截断了视觉上较窄的字符串,因为两个字符串包含相同数量的字符。算法将输入字符串分类为narrow、normal 或wide,然后适当截断可能就足够了。
这个问题并不是真正特定于语言的,但是如果有算法那么我会用 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/