为啥 TextOutW() 会因自定义字体大于 131 像素而失败?

Posted

技术标签:

【中文标题】为啥 TextOutW() 会因自定义字体大于 131 像素而失败?【英文标题】:Why is TextOutW() failing with custom fonts greater than size 131px?为什么 TextOutW() 会因自定义字体大于 131 像素而失败? 【发布时间】:2019-05-31 09:25:19 【问题描述】:

我有一个旧版 .Net 应用程序,它使用 gdi32 API 为客户端呈现自定义图像。客户端有时会提供自定义字体作为安装在机器上的 otf 文件。当大小低于 132 时,“设计器”字体似乎渲染得很好。我使用常用​​的 windows 字体超过了这个大小,没有问题。到目前为止,我所能找到的是,当尝试自定义字体大于 131 TextOutW() 时返回 false(根据 MS Docs,这意味着函数失败)。这并不能告诉我很多。谁能提供有关为什么会发生这种情况的见解或指出我更好地调试此问题的方向?

【问题讨论】:

字符串有多长?即使在一两个字符的字符串上它也会失败?你从哪里得到 131px? 从来没有听说过这个,但是如果你使用 DrawText 或 GDI+呢? @Anders 请多多包涵。我最近才接触到这个功能。我们的绘图基于我们的创意团队提供的 SVG 文件。他们指定字体和大小,我们使用该值并在使用 CreateFontW 创建字体时将其插入 cHeight 参数。 GDI 和 GDI+ 中存在大小限制。任何像素大小都是 32k。你可能会击中它吗? 有人认为这是由于 OTF 与 TTF 的关系吗?现在我正在查看一些库存字体,它们似乎都是 TTF 并且工作正常。 【参考方案1】:

我已经确认 .otf 字体的大小上限远小于 .ttf 字体。切换到 ttf 字体起到了作用。我无法找到 GDI 不允许使用 .otf 字体更大尺寸的实际原因,但对于遇到相同问题的任何人来说,这都是一种可能的解决方法。

【讨论】:

以上是关于为啥 TextOutW() 会因自定义字体大于 131 像素而失败?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 和 Keycloak 因自定义身份验证提供程序而失败

.Net Core CORS 因自定义中间件而失败 [重复]

Cloud Foundry PHP 网站实例因自定义 mime 配置而崩溃

使用 Nginx 的 https SSL 证书验证因自定义构建的 libcurl+openssl 而失败,但适用于系统 curl

为啥 sed 会因国际字符而失败以及如何解决?

为啥这个应用程序会因运行时错误而崩溃?