Joh*_*ley 11 java algorithm text
这是一个很长的镜头,但是有没有人知道根据其内容估算和分类文本宽度(对于可变宽度字体)的算法?
例如,我想知道iiiiiiii并不像abcdefgh那么宽,而abcdefgh又不像WWWWWWWW那么宽,即使所有三个字符串的长度都是八个字符.
这实际上是尝试将一些智能构建到字符串截断方法中,该方法目前正在截断视觉上宽的字符串,但也不必要地截断视觉上狭窄的字符串,因为两个字符串包含相同数量的字符.算法可能足以将输入字符串分类为窄,正常或宽,然后根据需要截断.
这个问题并不是特定于语言,但如果有算法,那么我将用Java实现它.这适用于Web应用程序.我知道SO上有答案可以解决这个问题,使用JavaScript来获取包含div元素的宽度,但我想知道服务器端解决方案是否可行.
Mar*_*Pim 15
大多数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);
}
Run Code Online (Sandbox Code Playgroud)
没有经过测试,但你明白了.
在.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));
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这对我有用:
AffineTransform af = new AffineTransform();
FontRenderContext fr = new FontRenderContext(af,true,true);
Font f = new Font("Arial", 0, 10); // use exact font
double width= f.getStringBounds("my string", fr).getWidth();
Run Code Online (Sandbox Code Playgroud)