如何在画布上绘制像素字体而不使用抗锯齿

2023-12-14

我有一个像素艺术字体(在 ttf 文件中),我发现它的原始分辨率为 8 像素(CTX.font = '8px mainfont';)

当我执行 fillText 时,字体在 Firefox 中显示完美,但在 chrome 中显示模糊:

enter image description here firefox

chrome chrome

我尝试将 X 坐标偏移不同的量(例如 0.5),但它变得更加模糊。通常它始终是一个舍入整数。

I tried CTX.translate(0.5, 0); and CTX.imageSmoothingEnabled = true;

我尝试过CSSfont-smooth: none; font-smooth: never; -webkit-font-smoothing : none;

过去,我必须将字体转换为特殊格式,并使用库在画布上绘制它们。只是希望 5 年后他们添加一个官方方法来解决这个问题吗?


只是希望 5 年后他们添加一个官方方法来解决这个问题吗?

嗯...不超过几个月前,更多文本修饰符已经添加到画布 API, 在这之中ctx.textRendering,这基本上相当于SVG's text-rendering.

因此,没有一个选项会真正强制关闭抗锯齿功能,但使用它肯定会得到更好的结果textRendering = "geometricPrecision".

此外,目前仅基于 Chromium 的浏览器支持此功能......并且仅适用于chrome://flags/#enable-experimental-web-platform-features打开。

const label = document.querySelector( "label" );
const canvas = document.querySelector( "canvas" );
const ctx = canvas.getContext( "2d" );
if( !ctx.textRendering ) {
  console.warn( `Your browser doesn't support the textRendering property on Canvas
If you are on Chrome be sure to enable chrome://flags/#enable-experimental-web-platform-features` );
}

let state = 0;
const states = [
  () => {
    label.textContent = "optimizeLegibility";
    ctx.textRendering = "optimizeLegibility";
    drawText();
  },
  () => {
    label.textContent = "geometricPrecision";
    ctx.textRendering = "geometricPrecision";
    drawText();
  },
  () => {
    label.textContent = "difference";
    ctx.textRendering = "optimizeLegibility";
    drawText();
    ctx.globalCompositeOperation = "xor";
    ctx.textRendering = "geometricPrecision";
    drawText();
    ctx.globalCompositeOperation = "source-over";
  }
];

document.fonts.load( "120px pixel" ).then( begin );

function begin() {
  
  ctx.clearRect( 0, 0, canvas.width, canvas.height );
  ctx.font = "120px pixel";
  states[ state ]();
  state = (state + 1) % states.length;
  setTimeout( begin, 1000 );
  
} 
function drawText() {
  ctx.textBaseline = "top";
  ctx.fillText( "TESTING", 0, 0 );
}
@font-face {
  font-family: pixel;
  src: url("https://dl.dropboxusercontent.com/s/hsdwvz761xqphhb/pixel.ttf");
}
<label></label><br>
<canvas width="500"></canvas>

目前,最好的方法可能是将文本预先渲染为位图。

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

如何在画布上绘制像素字体而不使用抗锯齿 的相关文章

  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 如何精确缩放已翻译的d3地图

    我有一张已翻译的地图 以使其正确适合画布 我正在尝试实现一种缩放它的方法 它确实有效 但是当您放大时它会远离中心 而不是以鼠标甚至画布为中心 这是我的代码 function map data total views var xy d3 ge
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 预加载 javascript 和 css 文件

    我目前正在开发一个移动网站 该网站大量使用图像 CSS 和 JavaScript 例如 它使用未压缩的 150KB 的库 我为图像构建了一个预加载器 效果相当好 function loadImages images var sum 0 fo
  • Moment.js 动态更新时间(以秒为单位)

    我试图显示时钟 that 每秒更新一次 e g 2015 年 1 月 5 日 12 05 01 它似乎对我来说工作得很好 对于相同的代码 并且只有 moment min js 指向v2 11 0 看看代码 来源 MilkyWayJoe va
  • Webpack - 资产大小限制中的警告:以下资产超出了建议的大小限制 (244 KiB)

    当我在生产模式下运行 webpack 时 有资产规模限制 超出 的警告 我怎样才能运行而不出现这个错误 在我的项目中 我包含 css 并且我看到 webpack 构建中包含一些 node module 目录 但是如果我排除 css 的 no
  • Google 地图 Javascript v3 折线点击事件

    我正在尝试显示一张地图 其中有多条路线布置为折线 单击多段线时 我想显示特定于该线的数据 将数据与线关联不是问题 但无论单击哪条线 显示的数据都会与最近绘制的线关联 就好像每条新折线都会覆盖最后一条线一样 我有一个数据库 其中包含 gpx
  • 如何获取 Spotify API 的访问令牌?

    我已经研究 Spotify api 和示例源代码几天了 但我仍然不知道如何获取访问令牌来访问用户的播放列表数据 我已经到达了拉起登录窗口 用户登录 然后收到授权码的地步 此时 我尝试做这样的事情 window open https acco
  • JavaScript/jQuery - “$ 未定义 - $function()”错误

    我正在尝试运行 JavaScript jQuery 函数并且Firebug http en wikipedia org wiki Firebug 28software 29得到错误 is not defined function JavaS
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 带有桌子的嵌套表

    我在应用了表排序器的表中嵌套了表 它在嵌套表中添加了排序标题 但是它们没有对行进行排序 并且抛出了JavaScript错误 我想拥有 嵌套表不可排序 巢表上的排序实际上可以工作 但不是现状 您的第一个选择要容易得多 使嵌套表不可排序 像这样
  • jQuery 模板插件:如何创建双向绑定?

    我开始使用 jQuery 模板插件 微软创建的 但现在我面临这个问题 模板用于绑定到对象数组的一堆表单 当我更改其中一个表单上的某些内容时 我希望更新绑定的对象 但我不知道如何自动执行该操作 这是一个简单的例子 现实生活中的模板和对象要复杂
  • 如何使用 Node.js 解析 JSON? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我应该如何使用 Node js 解析 JSON 是否有一些模块可以安全地验证和解析 JSON 你可以简单地使用JSON parse h
  • 如何使用转义的 unicode 解码字符串?

    我不确定这叫什么 所以我在搜索时遇到了麻烦 如何使用 unicode 解码字符串http u00253A u00252F u00252Fexample com to http example com使用 JavaScript 我试过unes
  • Intern JS - 如何在链式 Command 方法中使用 Promise.all()?

    我是用 Intern JS 编写测试的新手 并且一直在遵循他们的文档来使用对象接口 https theintern github io intern interface object and 页面对象 https theintern git
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • “memset”没有 DLL 那么如何 ctype 它

    如何使用memset在 jsc 类型中 没有对应的 DLL 我搜索 搜索了 js ctype 代码 但找不到要破解的示例 如果你只是想memset一个数组为零字节 然后我有 好消息 大家 js ctypes 会将新数组初始化为零 否则 最简
  • 如何使用 Chart.js 版本 3.2.1 在圆环图中添加文本

    我正在使用 Canvas 在 HTML 中使用 如何使用在圆环图中添加文本 这是我的 javascript 代码和 HTML 代码 我使用了图表js版本3 2 1 所以请给出相同版本 3 的解决方案 var overallStatsCanv
  • 使用 javascript 从亚马逊 URL 中抓取 ASIN

    假设我有一个像这样的亚马逊产品 URL http www amazon com Kindle Wireless Reading Display Generation dp B0015T963C ref amb link 86123711 2
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto

随机推荐

  • 如何因不活动而注销用户

    纯服务器端 PHP 每次用户提交表单时 我都会更新数据库中的 上次活动 时间 我想进行定期检查并强制注销非活动用户以释放许可证 我该怎么做呢 我是否还应该将会话 ID 存储在数据库中 然后销毁会话 这将为另一个用户释放许可证 当第一个用户最
  • 对齐捕获的深度和 RGB 图像

    之前有过提问 here here and here 与我的问题相关 但是我的问题有一个不同的方面 我在之前提出的任何问题中都没有看到过 我使用 Kinect 深度传感器获取了用于研究的数据集 该数据集采用 png 图像格式 用于特定时刻的深
  • Swagger-ui 与 Spring 安全性

    我有一个带有身份验证服务的简单 REST 应用程序 我尝试向其中添加 swagger 和 swagger ui 但我只能看到我的端点 v2 api docs In swagger ui html我只看到端点组 但无法扩展任何列表 在 chr
  • 本地化 (l10n):为我的 mozilla 插件设置默认语言

    我正在开发一个 Mozilla 插件并实现 l10n 我的问题是 如何为我的插件设置默认语言 当我的插件不支持语言时 它会切换到默认语言 当 Mozilla Firefox 的语言改变时 插件会改变它的语言环境吗 如何更改我的 Firefo
  • 图像周围的 Silverlight 文本

    我正在尝试将文本包裹在图像周围 就像使用 html float 属性一样 有没有办法在 silverlight 3 中实现这一点 Thanks 我不久前解决了这个问题 据我所知 确实没有什么好方法 这会起作用 尽管只是很痛苦 为了简化解释
  • 如何配置 PyCharm 在没有 ^space 的情况下自动完成代码?

    When typing in PyCharm I used to automatically get code completion suggestions without having to hit Ctrl Space I must h
  • 没有提升的 WCF wsdualhttpbinding 客户端

    我创建了一个 Windows 服务 服务器 和一个使用 WCF wsdualhttpbinding 回调功能的 WPF 客户端 两个软件之间的所有内容都可以正常工作 但我遇到的问题是客户端需要以管理员权限运行才能工作 这是可以理解的 因为它
  • 适用于 VB6 和 .net 应用程序的最佳 IPC

    在我们的应用程序 文档管理系统 中 我们应该收到屏幕更改的通知 或通知其他程序屏幕更改 以便使两个应用程序查看相同的数据 一个是订单履行应用程序 另一个是订单履行应用程序原始传真的文档查看器 履行应用程序是用 vb6 编写的 文档管理器是用
  • SQL Server 文件名和版本[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我很幸运能够成为一台服务器的管理员 但我不知道这台服务器上有多少个版本的sql server 当我打开Microsoft SQL Server文件时 有一些名为80 90 100 1
  • 线性渐变在 IE 11 中不起作用

    我有一个 css 规则 可以在 chrome firefox 中正常工作 并且曾经在 IE 中工作 现在我看似有效的 css 不起作用了 s tour border radius 5px margin 0 auto width 250px
  • Java HttpClient - 通过代理发布文件

    我尝试使用代理从我的网络应用程序调用外部网站 此外 还需要在此外部网站上执行 POST 请求 我正在使用 tomcat7 org apache httpcomponents 4 3 4 spring 在没有代理的情况下进行跟踪是有效的 我得
  • dropwizard 应用程序中的配置更改以与 React browserHistory 配合使用

    我有一个react应用程序运行在dropwizard服务器 这bundle js在 ui 上提供 当我打开 ui 上的 url 并导航应用程序 并转到 ui content 时 它工作正常 但是当我尝试刷新特定页面 例如 app conte
  • 在 ssrs 中显示 10 行的最大值

    我有一份报告 其中我想显示 10 名具有最高薪水的员工数据 我想通过 SSRS 来完成此操作 请帮助我 请通过 SSRS 而不是 SSMS 来完成 提前致谢 我假设您有一个数据集 每个员工一行 按工资降序排序 您可以申请一个TOP N过滤到
  • 如何在 Swift 中使用 CTFontCopyCharacterSet() 获取字体的所有字符?

    如何获取字体的所有字符CTFontCopyCharacterSet 在斯威夫特 对于 macOS 在实施该方法时出现了该问题OSX CGGlyph 到 UniChar用斯威夫特回答 func createUnicodeFontMap Get
  • 禁用的文本框丢失视图状态

    我根据所选的下拉菜单动态生成表单 该表格由字段组成 十进制值的数据输入 几个文本字段 必须在末尾添加所有小数值并用该值更新 Total TextBox 总计文本框被禁用 当用户输入值后单击表单上的 保存 按钮时 除了禁用的文本框之外 整个表
  • Python - Pandas:选择每组的第一个观察结果

    我想使用以下命令将我以前的 SAS 代码改编为 Pythondataframe框架 在 SAS 中 我经常使用这种类型的代码 假设列按 group id 排序 其中 group id 取值 1 到 10 其中每个 group id 有多个观
  • 有没有办法使用 Excel 以编程方式使用动态数据定义表区域?

    我有一张包含表格的工作表 由 jasper 报告查询生成 该表将成为我的数据透视表的来源 数据透视表是使用外部连接 来自 Microsoft Query 创建的 由于需要先定义源表 然后才能在 Micrososft Query 中使用它 所
  • 打开和关闭 mysqli 查询的正确方法

    我有一个简单但令人困惑的问题 特别是对于像我这样自学程序员的人 我已经阅读了 PHP NET 和 MYSQL COM 中的不同文档 它们都解释了如何打开和如何关闭它 但对于这个问题并没有真正的帮助 至少对我来说 我学习的方式如下我需要一个文
  • 按最近日期过滤查询结果

    这段代码 SELECT O896IA VEMPPRSA REG NR O896IA VEMPPRSA DIS NR AS RRDD Mgmt Lvl MGMT LVL Count O896IA VEMPPRSA SYS EMP ID NR
  • 如何在画布上绘制像素字体而不使用抗锯齿

    我有一个像素艺术字体 在 ttf 文件中 我发现它的原始分辨率为 8 像素 CTX font 8px mainfont 当我执行 fillText 时 字体在 Firefox 中显示完美 但在 chrome 中显示模糊 firefox ch