如何解决Graphics.MeasureString不包含某些字符的某些部分
private Bitmap ConvertTextToImage(string text,FontFamily fontFamily,float fontSize,FontStyle fontStyle = FontStyle.Regular,StringFormat stringFormat = default,float MaxWidth = float.MaxValue,float MaxHeight = float.MaxValue,float xDpi = 72,float yDpi = 72,Color backgroundColor = default,Color foregroundColor = default)
{
if (text == "") return null;
Bitmap bitmap = new Bitmap(1,1);
Graphics graphics = Graphics.FromImage(bitmap);
if (stringFormat == default) stringFormat = new StringFormat();
if (backgroundColor == default) backgroundColor = Color.Transparent;
if (foregroundColor == default) foregroundColor = Color.Black;
Font font = new Font(fontFamily,fontSize,fontStyle);
Sizef stringSize = graphics.MeasureString(text,font,int.MaxValue,stringFormat);
while (stringSize.Width > MaxWidth || stringSize.Height > MaxHeight)
{
fontSize -= (float)0.1;
font = new Font(fontFamily,fontStyle);
stringSize = graphics.MeasureString(text,stringFormat);
}
bitmap = new Bitmap((int)stringSize.Width,(int)stringSize.Height);
graphics = Graphics.FromImage(bitmap);
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
bitmap.SetResolution(xDpi,yDpi);
graphics.Clear(backgroundColor);
int x = 0;
if (stringFormat.FormatFlags == StringFormatFlags.DirectionRightToLeft && stringFormat.Alignment == Stringalignment.Center)
x = (int)stringSize.Width / 2;
else if (stringFormat.FormatFlags == StringFormatFlags.DirectionRightToLeft) x = (int)stringSize.Width;
else if (stringFormat.Alignment == Stringalignment.Center) x += (int)stringSize.Width / 2;
graphics.DrawString(text,new SolidBrush(foregroundColor),x,stringFormat);
return bitmap;
}
它可以正常工作,但是使用IranNastaliq字体时有时不生成某些字符。例如,查看在字符串开头的波斯字符“گ”(突出显示的部分在原始图片中,而不是由GDI创建)。带圆圈的部分应该更长:
和这个。裁剪圆点(也在字符串的开头):
我认为Graphics.MeasureString
不能衡量这些部分。我可以在开始时添加一些空格字符,但这会导致其他一些问题。我该如何解决?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。