为什么 Graphics.MeasureString 测量阿拉伯字符串不正确?
Why Graphics.MeasureString measures Arabic strring incorrectly?
我有一个阿拉伯字符串,它是阿拉伯字符串和“:100”连接的结果。此字符串测量和绘制不正确。为什么?
public partial class Form1 : Form {
string strIncorrectMeasure = "مەھسۇلات باھاسى" + " : " + "100";//"مەھسۇلات باھاسى : 100";
string strCorrectMeasure = "100 : مەھسۇلات باھاسى";
Font font = new Font("Oybab tuz", 18);
public Form1() {
InitializeComponent();
}
void button1_Click(object sender, EventArgs e) {
var bitmap = new Bitmap(100, 100);
var graphics = Graphics.FromImage(bitmap);
StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft | StringFormatFlags.NoFontFallback | StringFormatFlags.NoClip);
SizeF measuredIcorrectSize = graphics.MeasureString(strIncorrectMeasure, font, 0, format);
SizeF measuredCorrectSize = graphics.MeasureString(strCorrectMeasure, font);
MessageBox.Show(string.Format("FirstString : {0}\nSecondString: {1}", measuredIcorrectSize, measuredCorrectSize));
}
void Form1_Paint(object sender, PaintEventArgs e) {
var font = new Font("Oybab tuz", 18);
StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString(this.strIncorrectMeasure, font, Brushes.Black, new PointF(300, 10), format);
e.Graphics.DrawString(this.strCorrectMeasure, font, Brushes.Black, new PointF(10, 50));
}
}
这个问题有没有可能是这个字体引起的?
我找不到 Oybab tuz 字体。但是,使用 SystemFonts.MenuFont
和 SystemFonts.DefaultFont
,两种尺寸结果相同。
使用 Graphics.MeasureString
和 MenuFont
返回值 162.1289。然而,截取屏幕截图并在位图编辑器中测量真实宽度会导致宽度为 155 像素。如果您需要真实宽度,则需要将文本绘制到位图,然后通过查看像素值找到边界矩形。
此外,您无需创建 Bitmap
即可获得 Graphics
对象。只需调用 CreateGraphics()
。此外,您应该通过将对象包装在 using
语句中来处理这些对象。
我还没有找到解决办法。我认为,字体本身存在问题。其他字体正常。
我有一个阿拉伯字符串,它是阿拉伯字符串和“:100”连接的结果。此字符串测量和绘制不正确。为什么?
public partial class Form1 : Form {
string strIncorrectMeasure = "مەھسۇلات باھاسى" + " : " + "100";//"مەھسۇلات باھاسى : 100";
string strCorrectMeasure = "100 : مەھسۇلات باھاسى";
Font font = new Font("Oybab tuz", 18);
public Form1() {
InitializeComponent();
}
void button1_Click(object sender, EventArgs e) {
var bitmap = new Bitmap(100, 100);
var graphics = Graphics.FromImage(bitmap);
StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft | StringFormatFlags.NoFontFallback | StringFormatFlags.NoClip);
SizeF measuredIcorrectSize = graphics.MeasureString(strIncorrectMeasure, font, 0, format);
SizeF measuredCorrectSize = graphics.MeasureString(strCorrectMeasure, font);
MessageBox.Show(string.Format("FirstString : {0}\nSecondString: {1}", measuredIcorrectSize, measuredCorrectSize));
}
void Form1_Paint(object sender, PaintEventArgs e) {
var font = new Font("Oybab tuz", 18);
StringFormat format = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString(this.strIncorrectMeasure, font, Brushes.Black, new PointF(300, 10), format);
e.Graphics.DrawString(this.strCorrectMeasure, font, Brushes.Black, new PointF(10, 50));
}
}
这个问题有没有可能是这个字体引起的?
我找不到 Oybab tuz 字体。但是,使用 SystemFonts.MenuFont
和 SystemFonts.DefaultFont
,两种尺寸结果相同。
使用 Graphics.MeasureString
和 MenuFont
返回值 162.1289。然而,截取屏幕截图并在位图编辑器中测量真实宽度会导致宽度为 155 像素。如果您需要真实宽度,则需要将文本绘制到位图,然后通过查看像素值找到边界矩形。
此外,您无需创建 Bitmap
即可获得 Graphics
对象。只需调用 CreateGraphics()
。此外,您应该通过将对象包装在 using
语句中来处理这些对象。
我还没有找到解决办法。我认为,字体本身存在问题。其他字体正常。