【问题标题】:How would you calculate the point size of a font necessary to best fit a predefined area?您将如何计算最适合预定义区域所需的字体的磅值?
【发布时间】:2011-04-16 22:32:58
【问题描述】:

我有一个有趣的问题。我快到了,但很好奇其他人将如何解决它。我想在预定义的区域中显示一些多行文本。我不知道文本将是什么或区域有多大,因此必须通用编写该函数。您可以假设始终使用标准字体,但必须更改磅值。

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

这两个方程可能有用:

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

还有:

float dpi = CreateGraphics().DpiY;

【问题讨论】:

  • 哇,看看到目前为止的建议,我没有意识到最后一点会如此迭代!如果我们假设文本没有被换行怎么办。硬返回会打断多条线,所以我们只需要担心最长的线的宽度。

标签: c# graphics fonts font-size dpi


【解决方案1】:

嗯,这很棘手。直接计算点大小是行不通的,文本的宽度取决于字体度量。二分搜索是一种显而易见的策略,但它在实践中行不通。真实类型的提示和自动换行会破坏它的稳定性。

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

【讨论】:

  • 不允许自动换行会更容易吗?
  • 是的,二分查找失败的可能性要小得多。但由于暗示而不是零。当范围小于 1 点时停止搜索。
【解决方案2】:

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

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

我建议选择两个点大小(例如 6 和 18),它们代表最小和中点到高点,并计算每个点大小中每个单词的像素宽度。然后,您可以计算两种大小的文本的面积。

然后,您可以推断出您认为合适的矩形区域,并使用基于文本长度的任意宽度/高度比来确定目标大小(宽度和高度) - 例如,有一个最佳可读宽度。

然后,您需要反复尝试在矩形内自动换行,并在磅值上向后工作,直到文本适合矩形。

【讨论】:

  • 如果我们不考虑自动换行会怎样。我们假设换行符将行分开,并且没有一行会超出矩形
  • 重要的是首先计算宽度并且一旦计算就不要改变它,然后你可以使用宽度来限制线条的长度并最终得到一个矩形,它将(可能)是高一两行。它并不总是看起来不错,但报纸栏目使用了经过仔细计算的栏目宽度,以实现最大的可读性。使用 US Letter 或 A4 比例的矩形(大约 1.3:1)。此外,字宽数组有助于快速迭代解决方案。
【解决方案3】:

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

【讨论】:

  • 您如何确定“适合”?
猜你喜欢
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多