c# - 不同分辨率下 graphics.MeasureString 的奇怪行为

标签 c# .net graphics gdi+ resolution

我注意到 Graphics.MeasureString 在不同分辨率下的奇怪行为。

对于默认分辨率 (96x96),我测试的不同字体大小之间存在线性关系。

但是,如果我将它提高到 512 x 512,线性关系就会消失,并且在使用度量字符串时会发生一些非常奇怪的事情。 (参见下面的 4 个图)

如果我将分辨率保留为图形对象的默认大小,并测量字体大小,则字体大小与字符串宽度之间的关系如下:

图形对象,默认分辨率 (96):

字体大小(X 轴),特定字符串的宽度(Y 轴) Width96

字体大小(X 轴),特定字符串的高度(Y 轴) Height96

但是,如果我改变分辨率

图形对象,512分辨率:

字体大小(X 轴),特定字符串的宽度(Y 轴) enter image description here

字体大小(X 轴),特定字符串的高度(Y 轴) enter image description here

有人知道为什么会这样吗?

谢谢。

请注意,我使用的是 .NET 4(完整配置文件)

用于生成图表的代码(更改每种类型的分辨率):

string str = "6  CN-3 Tie EomgVeo405- 2ss>era09rni IBne 20iopv Atdrsn - Ng72";
SizeF sizef = new SizeF(855, 14.000001f);
StringFormat stringFormat = new StringFormat() 
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Near,
    Trimming = StringTrimming.None,
    FormatFlags = StringFormatFlags.NoClip,
};

Bitmap b = new Bitmap(901, 401);
//b.SetResolution(512, 512);
Graphics g = Graphics.FromImage(b);

for (float x = origFont.Size; x >= 0.5; x -= 0.1f)
{
    var data = g.MeasureString(str, new Font("Microsoft Sans Serif", x), sizef, stringFormat);
    Console.WriteLine(x + "\t" + data.Width + "\t" + data.Height);
}

最佳答案

这个答案是一个猜测,但证据完全符合它。

您看到的是字符串被包裹在两条线上。

让我们假设如下:

  1. 文字的宽度与字体大小成线性比例
  2. 文字高度与字体大小成线性比例

这符合您的 512 分辨率图表的开始,一切都线性增加。

在某些时候,宽度急剧减小一定量,同时高度增加一倍。

这意味着一个单词被移到了第 2 行,它的高度增加了一倍(2 行对之前的 1 行),并且字符串的宽度变小了一定量,因为该行的最后一个单词现在位于行首2.

从那里开始,随着字体大小的增加,仍然在第 1 行的字符串部分线性变宽,宽度再次缓慢增加。同时,高度呈线性增加,但现在的速度是休息前的两倍,因为现在有 2 条线变得更高,而之前只有 1 条。

在某些时候,第 1 行的最后一个单词再次打破最大宽度并在第 2 行向下移动,在之前单独在那里的单词之前,在那个时候,宽度再次急剧减少一定金额。

如果您要继续您的图表,我预测宽度将继续其当前模式。它每次下降的确切数量与被移动的单词的宽度成正比。同时,在某些时候第二条线需要被打破,在这种情况下你会得到 3 倍的高度,然后高度将以 3 倍的速度增加,依此类推。

关于c# - 不同分辨率下 graphics.MeasureString 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526122/

相关文章:

c# - 使用 Manatee.trello 获取用户列表时出现 MissingMethodException

c# - 在 log4net 中禁用特定级别

c# - .PDB 文件未生成

c# - 计算给定日期范围内星期一的数量

java - 为什么这个 BufferImage 渲染方法有效?

c++ - 什么是内斜接计算?

.net - SetSystemTime kernel32 中的奇怪行为

c# - Dictionary<T> 的 SingleOrDefault 集合版本是什么?

.net - 如何在.Net 中将上传的 RGB 格式图像转换为 CMYK 格式?

c# - 画线 : Top and Left are incorrect