在javascript中计算精确的字符\字符串高度

2024-06-27

我正在使用画布,但我想不出任何解决方案,也无法在线找到问题的答案。

我有一种字体,其中包含不同尺寸(高度和宽度)的符号\字符。

我想从字体中绘制一些字符(符号),并在符号的顶部\向下绘制一些字符。 问题是我无法找到一种方法来获得我正在绘制的字符的精确高度(以像素为单位),并且这会导致中心符号与上\下符号之间出现不必要的空格(用于获取一个字符串,有函数 context.measureText(theText) )。

对于前。假设我希望“X”成为我的中心符号。和“-”位于顶部。 它看起来像这样

-
x

但现在“X”和“-”之间有我不想要的空格。

谁能帮我这个 ?

Thanks


宽度很简单:画布的上下文有一个内置的度量来测量文本宽度。

// this will measure text width
context.font = '14pt Verdana';
var m=context.measureText(yourText);
var theWidth=m.width;

高度更困难,因为measureText 不计算高度。

您通常可以使用字体大小来近似高度——这就是我所做的。

但如果您确实需要更高的准确性,这里有一个函数可以检查文本的像素以计算其高度:

function measureTextHeight(fontSizeFace) {

    // create a temp canvas
    var width=1000;
    var height=60;
    var canvas=document.createElement("canvas");
    canvas.width=width;
    canvas.height=height;
    var ctx=canvas.getContext("2d");

    // Draw the entire a-z/A-Z alphabet in the canvas
    var text="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    ctx.save();
    ctx.font=fontSizeFace;
    ctx.clearRect(0,0,width,height);
    ctx.fillText(text, 0, 40);
    ctx.restore();

    // Get the pixel data from the canvas
    var data = ctx.getImageData(0,0,width,height).data,
        first = false, 
        last = false,
        r = height,
        c = 0;

    // Find the last line with a non-transparent pixel
    while(!last && r) {
        r--;
        for(c = 0; c < width; c++) {
            if(data[r * width * 4 + c * 4 + 3]) {
                last = r;
                break;
            }
        }
    }

    // Find the first line with a non-transparent pixel
    while(r) {
        r--;
        for(c = 0; c < width; c++) {
            if(data[r * width * 4 + c * 4 + 3]) {
                first = r;
                break;
            }
        }

        // If we've got it then return the height
        if(first != r) return last - first;
    }

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

在javascript中计算精确的字符\字符串高度 的相关文章

随机推荐

  • 删除 Sql 服务器中最后一次出现特殊字符之前的子字符串

    我想删除最后一次出现句点之前的子字符串 查询应该转换r k Lee Brown to Lee Brown 所以 基本上我需要最后一个点之前的子字符串 并将其替换为 尝试这个 SELECT RIGHT str CHARINDEX REVERS
  • 具有共享代码的多个 JSF 项目的结构

    我有两个共享大量代码的 JSF 项目 java 类 xhtml 文件 标记库 css 和 javascript 文件等 我的开发环境 平台主要由 Eclipse Ant Perforce 和 Tomcat 组成 有没有人找到一种方法来创建和
  • Pickle 动态参数化子类

    我有一个通常存储腌制类类型的系统 我希望能够以相同的方式保存动态参数化的类 但我不能 因为我在尝试腌制一个未全局找到的类 未在简单代码中定义 时收到 PicklingError 我的问题可以建模为以下示例代码 class Base obje
  • SQL Server 中不需要的日期时间舍入

    我遇到了一些看起来很奇怪的事情 SQL Server 似乎正在舍入一些DateTime当我将它们保存到时 值不合适datetime列 我怀疑我错过了一些东西 但我找不到它 我正在使用 NET 4 0 针对 SQL Server 2008 运
  • 使用 Swift 更改整个应用程序中的 UILabel 文本颜色

    在 Swift 中有什么方法可以在整个应用程序中立即更改 UILabel 的文本颜色属性吗 我尝试过使用外观属性 但这不适用于 UILabel textColor 任何方式或任何同样工作的库 一种方法是使用颜色设置 首先在您的 xcasse
  • 如何随机打乱一个比 PRNG 周期更多排列的列表?

    我有一个包含大约 3900 个元素的列表 我需要对其进行随机排列以产生统计分布 我环顾四周 发现了这个使用 Python random shuffle 进行随机播放的列表的最大长度 https stackoverflow com quest
  • 为什么 WCF 不能传递字典中的对象?

    在我的 WCF 服务中 我有一个对象QualifiedNumber定义为KnownType and ServiceKnown类型 如果我使用QualifiedNumber通过以下方法 这个不起作用 它抛出一个异常 部分内容如下 元素 htt
  • ASP.NET MVC - 重写 FormMethod.Get 查询字符串?

    我有一个简单的表单 只有一个文本框和一个提交按钮 该表单基本上将文本框中的值作为查询字符串发送到不同的页面 当我单击提交按钮时 查询字符串采用以下格式 例如 mysite com TargetCode Test1 我希望它以这种格式显示 m
  • 在 VBA 中声明字典

    我收到错误Run time error 424 Object required当我尝试在 VBA 中创建字典时 我的代码如下所示 Private Sub data Dim dicti As Object Set dicti CreateOb
  • 为什么 en_GB 语言环境认为 1 月 1 日是一年中的第 52 周?

    事实证明 一年中的一周使用ww作为 2011 年 1 月 1 日的 Java 日期格式字符串 当语言环境为en GB 这是证明 使用 scala REPL 尽管我可以使用 Java 程序来完成此操作 首先获取我的语言环境 scala gt
  • Spring Data Rest (SDR) 错误:PersistentEntity 不能为 null

    我正在努力通过 SDR 公开我的 Spring 数据存储库 当我导航到我的休息网址时 http localhost 8080 trxes http localhost 8080 trxes 我得到一个错误 cause null messag
  • 如何通过代码检测Android上的表情符号支持

    通过代码 我可以制作一个按钮 将这 3 个表情符号插入到文本中 不过 在许多手机上 当用户单击按钮时 问题是 显示为 X X X 或者更糟糕的是 它只显示三个空白空间 我想在无法正确显示表情符号的 Android 设备上禁用并隐藏我自己的内
  • 如何检查单元格是否包含通配符星号 (*) 字符

    考虑以下两个公式 IF SEARCH A1 true false IF SEARCH CHAR 42 A1 true false 我正在用它来尝试检测单元格是否包含 字符 但这对所有单元格返回 true 我只能假设 Excel 看到 也许作
  • 我的 PDF 打开时可以 ping 我的服务器吗?

    我每天有一项 cron 工作 通过电子邮件将 PDF 发送给客户 我想知道有多少 PDF 文件被打开 有哪些可用的技术 网页中的标准技术是包含一个 img 标签 其中包含对记录 ping 的服务器端点的 src 引用 但PDF似乎不允许外部
  • 从批处理文件执行 SQL Server 脚本

    我有一个需要使用批处理文件执行的脚本 我是否在批处理文件中使用 SQLCMD 来运行脚本 此外 该脚本还将数据插入到数据库中的表中 我应该如何格式化批处理文件中的 SQLCMD 以便它知道它应该使用哪个数据库 首先 将查询保存到 sql 文
  • 如何在 SQL Server 会话中设置自动提交?

    如何在 SQL Server 会话中设置自动提交 您可以通过将implicit transactions设置为OFF来打开自动提交 SET IMPLICIT TRANSACTIONS OFF 当设置为ON时 返回隐式事务模式 在隐式事务模式
  • Java CSV Reader,读取剩余数据

    我有 CSV 数据如下 1 mm dd yy abc def pqr xyz 我想把它解析成 3 个字符串 1 mm dd yy 所有剩余数据 在本例中为 abc def pqr xyz 我尝试过几个库 openCSV javacsv 等
  • 批处理命令在Notepad++中打开某种类型的所有文件

    我有以下批处理命令来打开文件dtd扩大 REM Open all the static content files C Program Files x86 Notepad notepad exe D data folder1 File1 d
  • 创建宏来执行默认初始化

    我有很多重复这个简单样板的方法 id myObject if myObject self myObject myObject class new return myObject 所以我想用一个简单的宏来替换它 define default
  • 在javascript中计算精确的字符\字符串高度

    我正在使用画布 但我想不出任何解决方案 也无法在线找到问题的答案 我有一种字体 其中包含不同尺寸 高度和宽度 的符号 字符 我想从字体中绘制一些字符 符号 并在符号的顶部 向下绘制一些字符 问题是我无法找到一种方法来获得我正在绘制的字符的精