如何计算最适合预定义区域所需的字体的磅值?

时间:2010-09-24 18:39:37

标签: c# graphics fonts font-size dpi

我有一个有趣的问题。我几乎在那里,但很好奇其他人会如何解决它。我想在预定义区域中显示一些多行文本。我不知道文本是什么,或者区域有多大,所以函数必须一般编写。您可以假设始终使用标准字体,但点大小必须更改。

假设您有一个函数将绘制在字符串参数中传递给它的文本。该函数有一个要绘制的表单对象,并且还传递一个矩形对象,该对象定义表单上文本的边界区域。该函数需要以适合的大字体显示给定矩形中表单上的文本。我面临的挑战是计算字体的大小,以便在最小的空白区域中尽可能地使文本适合。

这两个方程式可能很有用:

float pixels = (points *dpi)/72f;
float points = (pixels*72f)/dpi);

此外:

float dpi = CreateGraphics().DpiY;

3 个答案:

答案 0 :(得分:2)

嗯,这很棘手。直接计算点大小不起作用,文本的宽度取决于字体度量。二进制搜索是一种明显的策略,但它在实践中不起作用。真正的暗示和自动换行合谋破坏了它的稳定性。

我建议你从二进制搜索开始,将hi和lo设置为合理的默认值,如72和6.然后当范围缩小到比如5点时,开始测试每个单独的点大小,直到找到最大的一个适合。当您编写算法时,请确保您指的是大小为N但大小为N-1但不适合。

答案 1 :(得分:2)

任何解决方案都存在严重问题,您需要根据宽度确定此问题,这完全取决于字体。这意味着您需要根据预定义的磅值字体独立计算每个单词的宽度。当您更改磅值时,不能保证一致。

如果您希望解决方案准确无误,解决方案将不会很快。

我建议选择两个点大小(比如6和18)来表示最小点和中点到高点,并计算每个点大小中每个单词的像素宽度。然后,您可以计算两种文本大小的区域。

然后你可以推断出你认为合适的矩形区域,并根据文本的长度使用任意宽度/高度比确定目标尺寸(宽度和高度) - 例如,有一个最佳的可读宽度。 / p>

然后,您需要迭代地尝试在矩形内部进行自动换行,然后以点大小向后工作,直到文本适合矩形。

答案 2 :(得分:0)

点大小的二分搜索: 从最大可用点大小开始。如果它不适合,尝试一半,...