在 HTML Canvas 中添加字母间距

2023-12-14

我读过很多 StackOverflow 答案和其他页面,讨论如何在 Canvas 中设置字母间距。更有用的之一是canvas 元素中的字母间距

正如另一个问题所说,“我有一个要在其中绘制文本的画布元素。我想设置类似于 CSS letter-spacing 属性的字母间距。我的意思是在绘制字符串时增加字母之间的像素数量。请注意,字母间距有时被错误地称为字距调整。

我注意到一般方法似乎是逐个字母地输出字符串,使用measureText(letter) 获取字母的宽度,然后添加额外的间距。这样做的问题是它没有考虑字母字距调整对等。请参阅上面的链接以获取此示例和相关评论。

在我看来,对于“间距”的行距,执行此操作的方法是执行以下操作:

  1. 从位置 (X, Y) 开始。
  2. 使用measureText()测量整个字符串的宽度wAll
  3. 删除字符串中的第一个字符
  4. 使用 fillText() 打印位置 (X, Y) 处的第一个字符
  5. 使用measureText() 测量wShorter,即生成的较短字符串的宽度。
  6. 从整个字符串的宽度中减去较短字符串的宽度,得到字符的紧缩宽度,wChar = wAll - wShorter
  7. 将 X 增加 wChar + 间距
  8. wAll = wShorter
  9. 从步骤 3 开始重复

这不会考虑字距调整吗?我错过了什么吗? measureText() 是否会添加根据最外层字符或其他内容而变化的填充负载,如果是这样, fillText() 不会使用相同的系统来输出字符,从而消除该问题?上面的链接中有人提到“像素对齐字体提示”,但我不明白这如何适用于这里。任何人都可以一般性或具体地建议这是否有效或是否存在问题?

编辑:这不是另一个问题的重复 - 它链接到并引用。问题不在于如何根据建议的副本执行“画布中的字母间距”;这是针对这个问题和其他问题提出一个可能的解决方案(据我所知没有其他人建议),并询问是否有人可以看到或知道该提议的解决方案的任何问题 - 即它询问提议的解决方案和它的要点,包括measureText()、fillText()和“像素对齐字体提示”的详细信息。


好吧,我已经根据上面的伪代码编写了代码,并通过屏幕截图和目视差异进行了一些比较(缩放,使用例如剪辑框中的直线来比较每个字符的 X 位置和宽度)。对我来说看起来完全一样,间距设置为 0。

这是 HTML:

<canvas id="Test1" width="800px" height="200px"><p>Your browser does not support canvas.</p></canvas>

这是代码:

this.fillTextWithSpacing = function(context, text, x, y, spacing)
{
    //Start at position (X, Y).
    //Measure wAll, the width of the entire string using measureText()
    wAll = context.measureText(text).width;

    do
    {
    //Remove the first character from the string
    char = text.substr(0, 1);
    text = text.substr(1);

    //Print the first character at position (X, Y) using fillText()
    context.fillText(char, x, y);

    //Measure wShorter, the width of the resulting shorter string using measureText().
    if (text == "")
        wShorter = 0;
    else
        wShorter = context.measureText(text).width;

    //Subtract the width of the shorter string from the width of the entire string, giving the kerned width of the character, wChar = wAll - wShorter
    wChar = wAll - wShorter;

    //Increment X by wChar + spacing
    x += wChar + spacing;

    //wAll = wShorter
    wAll = wShorter;

    //Repeat from step 3
    } while (text != "");
}

演示/眼球测试代码:

element1 = document.getElementById("Test1");
textContext1 = element1.getContext('2d');

textContext1.font = "72px Verdana, sans-serif";
textContext1.textAlign = "left";
textContext1.textBaseline = "top";
textContext1.fillStyle = "#000000";

text = "Welcome to go WAVE";
this.fillTextWithSpacing(textContext1, text, 0, 0, 0);
textContext1.fillText(text, 0, 100);

理想情况下,我会向其抛出多个随机字符串并进行逐像素比较。我也不确定 Verdana 的默认字距调整有多好,尽管我知道它比 Arial 更好 - 关于其他字体的建议,请尝试感激地接受。

所以...到目前为止看起来还不错。事实上它看起来很完美。 还是希望有人能指出这个过程中的任何缺陷。

与此同时,我会将其放在这里供其他人看看他们是否正在寻找解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 HTML Canvas 中添加字母间距 的相关文章

随机推荐

  • 这里应该使用表值参数吗?

    我有以下查询 UPDATE students SET IsDeleted 1 WHERE StudentId IN SELECT StudentId FROM Class where PassId IN SELECT Id FROM Cla
  • AS3:setSelection 向上箭头覆盖

    当按下向上箭头时 我想关注 TextField 的末尾 我在用着 txt setSelection txt text length txt text length 这对于除向上箭头之外的任何键都非常有效 我相信当焦点处于文本字段的开头时 向
  • C++ 中的 MATLAB 函数 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有谁知道我们可以获得的资源FREEMATLAB 函数的 C 库 例如 线性代数问题可以使用 LAPACK 和 BLAS 来解决 另外 NET 项目中的 MATLAB 也是不可能的 我
  • Node.js 自签名证书在我的浏览器中仍然显示为“不受信任”

    我正在运行 Node js 服务器 并且尝试在本地托管该服务器并且不会收到任何 SSL 错误 这是我创建证书的过程 我在 Visual Studio Code 中打开终端并输入以下内容 openssl req nodes new x509
  • 将正向前瞻 (?=regex) 与 re2 一起使用

    因为我有点新re2 我试图弄清楚如何使用正向前瞻 regex 像 JS C 或任何 PCRE 风格Go 这是我正在寻找的一些示例 JS foo bar baz match s S baz Python re match s S baz fo
  • 在 C++ 中使用正则表达式对字符串进行标记并保留分隔符

    我想修改给定的正则表达式以生成以下匹配列表 我很难用语言描述这个问题 我想使用正则表达式来匹配一组 标记 具体我想要 要匹配 任何不包含这些字符的字符串都应该是匹配的 我遇到的问题是区分一根管道和两根管道 我怎样才能产生所需的匹配 非常感谢
  • 将函数应用于我的数据框中的所有列

    我无法将自定义函数应用到dataframe df pd DataFrame a related 1 related 0 related 1 b request 1 request 0 request 1 c offer 1 offer 0
  • 尝试制作带有条形图和差异线/值的动态 D3 图表

    我已询问以下有关创建显示差异值百分比和线条的条形图的帮助 以下是链接 如何使用 D3 js 在条形图中创建带有值的百分比差异箭头线 我创建此线程是为了寻求帮助 使同一图表更加动态 以下是我的尝试 以适合任何分辨率的方式使其动态化 即响应式
  • CMake target_include_directories(SYSTEM ...):SYSTEM 选项似乎不适用于针对 Xcode 的最新版本的 CMake

    我们正在构建一个依赖于Boost的应用程序 编译会产生很多警告 班级成员不能重新声明 在 Boost 标头 tag of hpp 中 为了避免生成垃圾邮件 我们决定将 Boost 标头包含为系统标头 target include direc
  • 交叉编译时缺少crt1和crti

    我正在尝试构建一个基于 GCC4 5 和 newlib 的交叉编译工具链 并启用 gold 和链接时间优化 GCC 编译正常 但没有生成 crt1 o 或 crti o 文件 因此 当我尝试使用编译器构建 Newlib 时 它会抱怨以下消息
  • PHP奇怪的按位运算符对字符串的影响

    更新 移至新问题 好吧 阅读 PHP 文档后 现在这些按位运算符就很清楚了 但是 嗯 这是什么 dump1 var dump two identical strings two identical strings mind the stri
  • 可以使用 htaccess 隐藏图像路径吗?

    我有这样的图像路径http blablablabla com Admin img blablabla jpg但我不想向用户显示此路径 我可以隐藏此 URLhtaccess 例如 用户将看到这样的路径http blablablabla com
  • NSLocalizedString 问题

    我有 IBAction about UIAlertView alert UIAlertView alloc initWithTitle NSLocalizedString About Title of AlertView message A
  • ostringstream 和复制构造函数的问题[重复]

    这个问题在这里已经有答案了 可能的重复 为什么不允许复制字符串流 如何在 C 中从一个字符串流对象复制到另一个字符串流对象 编译类 T 失败 Visual C 和 GCC 产生 iostreams 模板错误 这是代码 include
  • cellForRowAtIndexPath 从未在 UITableViewController 中调用

    使用 UITableViewController 永远不会通过以下方式调用 cellForRowAtIndexPath numberOfRowsInSection 是 import UIKit import EventKit class E
  • Xtext Bundle org.eclipse.emf.mwe.utils 无法解析

    我正在尝试学习使用 Xtext 当我使用市场或使用安装新软件在现有 Eclipse Neon 安装中安装 Xtext 时 我无法创建 Xtext 项目 请参阅无法在 Eclipse 中创建 Xtext 项目 然后我尝试使用 Eclipse
  • 如何使用GeoJson定义圆?

    我想在 Mongodb 中使用几何 但根据 geojson 不支持圆geojson org 我遇到了完全相同的问题 解决方案是创建一个大致近似于圆的多边形 想象一个具有 32 条以上边的多边形 我写了一个执行此操作的模块 你可以这样使用它
  • 在 Java 中验证日期

    我使用的是 NetBeans IDE 7 2 我有两个单独的课程newDateTest java and newDateMethod java 我目前正在使用我的方法类来验证我在测试类中使用的用户输入的日期 到目前为止 在我的测试课中 我有
  • 在第一个和最后一个网格项目之前和之后添加空格

    我的问题与此相同问题 但给定的解决方案不起作用 这里有一个codepen我正在处理的事情 我尝试了两种不同的方法 这两种方法几乎都是正确的 但不完全正确 1 申请 before and after第一个和最后一个网格项的伪类 不幸的是当我添
  • 在 HTML Canvas 中添加字母间距

    我读过很多 StackOverflow 答案和其他页面 讨论如何在 Canvas 中设置字母间距 更有用的之一是canvas 元素中的字母间距 正如另一个问题所说 我有一个要在其中绘制文本的画布元素 我想设置类似于 CSS letter s