gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:13:44 27 4
gpt4 key购买 nike

我注意到 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com