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

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)

  • Maaaybe,但在这种情况下,您遇到了在服务器上选择的图形上下文的问题...... (2认同)

小智 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)