如果操作系统低于 Win10,GraphicsPath AddString 对使用从右到左语言时的字体支持不够

Posted

技术标签:

【中文标题】如果操作系统低于 Win10,GraphicsPath AddString 对使用从右到左语言时的字体支持不够【英文标题】:GraphicsPath AddString not support enough to the font when use right to left language if operating system lower than Win10 【发布时间】:2019-05-24 03:04:12 【问题描述】:

我需要在我的 WPF 应用程序中 generate an image from a string 并显示它。这是我的代码:

// Create Image and generate string on it
System.Windows.Controls.Image img = new System.Windows.Controls.Image();


// This is the font that I need to render
Font DefaultFont = new Font("Oybab Tuz", 40f, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);

// Generate image from string
GraphicsPath graphicsPath = new GraphicsPath();

// As you see, the string include Right to left character, also include some other character in the middle
graphicsPath.AddString("سىناق123456789سىناق", DefaultFont.FontFamily, (int)DefaultFont.Style, DefaultFont.Size * 96f / 72f, new PointF(0f, 0f), StringFormat.GenericDefault);

// Turn the string to the image
RectangleF bounds = graphicsPath.GetBounds();

Bitmap bitmap = new Bitmap((int)(bounds.Width + bounds.X), (int)(bounds.Height + bounds.Y));
Graphics graphic = Graphics.FromImage(bitmap);

graphic.FillPath(new SolidBrush(System.Drawing.Color.FromArgb(0x33, 0x00, 0xFF)), graphicsPath);
graphicsPath.Dispose();
graphic.Dispose();


// turn the Image to ImageSource
MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Png);

img.Source =  (ImageSource)(new ImageSourceConverter()).ConvertFrom(memoryStream);

// Add the image to the window content
this.Content = img;

现在这将在windows 10 中完美显示,如下所示:

但是,如果操作系统低于Windows 10,例如:Windows XPWindows 7Windows 8.X,则会显示如下:

不仅是数字,如果我输入一些其他字符,例如:“&&”

“你好&&&&你好”

较低的操作系统仍然显示为:

"سىناق سىناق"

操作系统好像自动删除中间的字符。

我知道我在其中使用is not include the number or the character which I put 的字体,但Windows 10 可以正确显示它。

这里是字体:Download font file

因为字符不会只显示在特定的地方,所以I can't split the string, and render it one by one

所以我真的很想知道why,还有I hope some guys could give me advice to fix this problem when operating system lower than Windows 10。谢谢。

【问题讨论】:

很多方法的net库只是调用windows dll的包装器。因此,如果存在操作差异,则说明 windows dll 存在问题,PC 上的文化设置不同,或者安装的字体不同。你有PC上的所有Windows更新吗?你用的是什么字体?如果所选字体不可用,Windows 将自动选择最接近的字体。可能此错误是由于使用了不同的字体。找出用于好结果和坏结果的字体名称。 @jdweng,感谢您的回复,字体文件地址我已经把它放在我的问题中,我也确定我在每个操作系统中都安装了所有更新,我也确认文化设置相同并且正在运行系统很干净,没有其他字体。 字体是否支持所有字符。我怀疑你有“不支持的 Unicode 字符”。请参阅:wavemetrics.com/forum/general/… @jdweng,正如我之前在我的问题中所说,数字和一些字符Not in the font,但我只希望它在像 Windows 10 这样的低版本操作系统中工作。 我不确定如何解决。我不认为你想让 TUZ 成为默认字体,因为它缺少字符。您希望默认字体包含所有字符。然后使用 TUZ 作为所选字体。使用 Word/Excel 中的字符映射工具,您可以将缺失的字符添加到 TUZ 字体。那将是手动的,不知道如何在软件中进行。我会使用 Excel 并打开 TUZ 的字符映射表,看看缺少哪些字符。 【参考方案1】:

访问此链接: https://docs.microsoft.com/en-us/windows/win32/api/gdipluspath/nf-gdipluspath-graphicspath-addstring(inconstwchar_inint_inconstfontfamily_inint_inreal_inconstrect__inconststringformat)

这是一个关于 GraphicsPath AddString 方法及其使用方法的 Windows 网站。如果向下滚动,您会发现一个标记为要求的选项卡。仔细检查您的 Windows 操作系统是否满足这些要求。如果他们不这样做,路径将无法正常工作。

【讨论】:

【参考方案2】:

我从过去发现了以下问题:

Generic GDI+ exception in GraphicsPath.AddString() with certain fonts and characters

可能在旧版本的 Windows 中您会遇到一些问题, 有一个特定 KB that suppose to fix it 的链接 - 值得一试:)

顺便说一下,您是否尝试过使用其他字体类型或更改字体类型只是为了检查是否会发生变化。

希望对你有帮助

阿萨夫

【讨论】:

但是在 windows 8.1 和 windows server 2012 中呢? 那么 XP 怎么样? 您好,这是一个 Microsoft 已知问题。如果他们只为 Windows 7、Vista 和一些服务器解决了这个问题,那么我无能为力;)。

以上是关于如果操作系统低于 Win10,GraphicsPath AddString 对使用从右到左语言时的字体支持不够的主要内容,如果未能解决你的问题,请参考以下文章

win10的服务主机能不能关掉,关了会有啥影响吗?

thinkpad l460为啥装不上win7

ESXi 5.1 如何设置自动关机

ubuntu20.4 + win10 双系统安装简化版

ubuntu20.4 + win10 双系统安装简化版

用虚拟机安装win7 时候黑屏如题啊?