0 < lineWidth < 1 时的画布线条行为

2024-01-11

出于好奇,我想尝试设置lineWidth < 1因为即使我的分辨率设置正确,1px 的线条看起来也很粗。不出所料,它不起作用,但在 Chrome 和 Firefox 上有这种奇怪的行为(未在其他地方测试过):

左边是 lineWidth = 1,中间是 lineWidth = 0.5,右边是 lineWidth = 0.1

它们是用以下代码生成的:

ctx.lineWidth = 0.1;

        lis.each(function(i) {

            sx = $(this).offset().left;
            sy = $(this).offset().top;

            ex = sx - (20 * (6-i));
            ey = wh - 80 - (20 * (i + 1));
            eey = ey - (20 * i);

            // Horizontal
            ctx.moveTo(sx,sy+7);
            ctx.lineTo(ex, sy+7);
            ctx.stroke();

            // Vertical
            ctx.moveTo(ex,sy+7);
            ctx.lineTo(ex, ey);
            ctx.stroke();

            // Horizontal
            ctx.moveTo(ex,ey);
            ctx.lineTo(ww - bg_img_width + 100, eey);
            ctx.stroke();
        });

它们按照子级出现的顺序打印,因此每次都以 Alpha 开头,以 Epsilon 结尾。

谁能解释为什么当循环进行时线条会变细0 < lineWidth < 1?这是故意的吗?它可以用于很酷的东西吗?


首先要提醒的是,画布中的点以 (0.5;0.5) 为中心,因此,要绘制一条干净的 1px 宽线,必须在整数坐标 + (0.5, 0.5) 处绘制。

然后,为了模拟厚度,渲染器将在不透明度上发挥作用:0.5 的线将被渲染为较小的不透明度,使其看起来“较弱”。
请注意,这也是抗锯齿的工作方式:它将点扩散到具有较低权重的几个相邻点上,以模拟线条的粗细。

您可以使用下面的小提琴来比较几种绘制三角形的方法。

例如,我认为当我们使用 0.8 的不透明度进行绘制时,我们具有与 lineWidth=0.5 相同的视觉效果。

前两行显示使用整数坐标与使用整数 + 0.5 坐标时渲染的差异。我们看到,当使用整数坐标时,线条在两个像素上重叠并且看起来更宽。
我们还看到,抗锯齿效果并不是那么好,因为对角线总是看起来更粗(在 Chrome 或 Firefox 上也是如此)。

http://jsbin.com/voqubexu/1/edit?js,输出 http://jsbin.com/voqubexu/1/edit?js,output

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

0 < lineWidth < 1 时的画布线条行为 的相关文章

  • 如何在FireFox中检查用户访问麦克风的权限是否被拒绝

    有没有办法查明用户是否拒绝或允许媒体设备的权限 例如 Firefox 中的麦克风 摄像头 在 Chrome 中 我可以使用 navigator permissions query 检查这一点 但在 Firefox 中会失败并出现 TypeE
  • 以编程方式更改 StackPanel 在 Canvas 上的位置

    我在画布上有堆栈面板 堆栈面板有
  • 如何在购物车中显示自定义属性(Magento)

    我尝试了很多东西 但没有一个起作用 我想我可以在产品页面上获取自定义属性 但我想知道 如何在购物车页面中获取它们 属性只是简单的文字 item gt getProduct gt load 将从数据库重新加载所有产品数据 虽然这可行 但请记住
  • 数据库中的 HTML 标签是不好的做法还是好的做法?

    有时我需要格式化来自数据库的特定数据或部分数据 例如 如果我有这样的 desc 存储在数据库中 HTML 4 经过调整 延伸和增强 超出了其最初的范围 为网站带来了高水平的交互性和多媒体 Flash Silverlight 和 Java 等
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 如何使两个
    ...
    位于同一行?

    我的意思是 两个标签具有相同的高度 对所有 div 尝试这个 display inline block
  • 将整个网页设计为 SVG 文件

    免责声明 我意识到鉴于标题的荒谬 这听起来像一个巨魔 然而 这是一个真正的问题 我的背景涉及OpenGL x86 汇编 我最近开始学习网络编程 我真的很喜欢 SVG CSS 并且想知道 为什么人们不使用 SVG 设计整个网页 Context
  • 保留以下文本的标题

    我正在使用 css 列计数功能将我的部分分成两列 在一个页面上 我在第一列的底部有一个 h3 标题 在下一列的顶部有一个 p 段落 我想保留该段落的前几句话的标题 我可以将其与整个段落一起包装在使用 inline block 样式的 div
  • 恢复默认的CSS属性

    我正在编写一个可在多个网站上使用的组件 每个网站都有自己的样式表 并且以不同的方式显示某些内容 我的所有 html 都包含在一个带有 id 的 div 中 div div 然而 我的组件是在所有网站上看起来一致 这很好 因为我将样式应用于组
  • data:image/png;base64 是什么意思?

    我从一个在线网站上举了一个例子 CSS 包含一个指向 png 的 URL 和一些随机字母 在这两种情况下 任何人都可以告诉我如何制作这样的代码 或者更确切地说 这些代码是关于什么的 这是html
  • 为什么插入符号在具有position:relative的contenteditable中不可见?

    When a contenteditable元素有position relative和背景颜色 插入符号放置在该元素中时是不可见的 这是一个例子 bug position relative background color lightgre
  • 我在没有任何用户操作的情况下显示 javascript 输出时遇到问题

    这就是问题 如果一个整数大于 1 并且只能被 1 和它本身整除 则该整数被称为素数 例如 2 3 5和7是素数 但4 6 8和9不是素数 a 编写一个函数来确定一个数是否为素数 b 在脚本中使用此函数来确定并打印 1 到 10000 之间的
  • 使用 angularjs 在 Internet Explorer 中获取 Blob url

    鉴于此代码 来自其他人 var module angular module myApp module controller MyCtrl function scope scope json JSON stringify a 1 b 2 mo
  • 是否可以使materialize.css模态更大并删除垂直滚动条?

    我刚刚创建了按钮 单击后会弹出一个模式 每个按钮都有一个显示不同练习 gif 的模式 然而 模态框太小 导致用户无法看到整个 gif 迫使他们向下滚动 我想删除滚动条并使模态更大 以便用户可以看到整个 gif 任何帮助都会很棒 这是我的代码
  • HTML Mobile - 强制软键盘隐藏[重复]

    这个问题在这里已经有答案了 我正在为一家优惠券公司开发前端网站 我有一个页面 用户只需输入电话号码和花费的美元 我们想出了一个有趣的内置 Javascript 屏幕键盘 它易于使用且快速 但是 我正在寻找一种解决方案 以在用户聚焦并在这些字
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • 如何按时间间隔翻转div

    您好 请看这个脚本并告诉我如何按时间间隔翻转 A B 和 C div 我希望A先翻转然后停止 B接下来翻转并停止 然后C然后再次回到A B和C 就像循环一样 然后重新开始 这在 CSS3 中可能吗 在此代码中 所有 div 同时翻转 HOL
  • 如何将本地文本文件上传到文本区域(网页内)

    我是一名新手程序员 需要一些帮助来弄清楚如何将本地文本文件上传到我正在构建的网站内的文本区域 我非常精通 HTML CSS 对 Javascript JQuery 有相当的了解 而且我刚刚学习 PHP 您能提供的任何帮助我将不胜感激 我有一
  • SVG线宽问题

    我开始了我的svg学习 我想用svg线做一些技巧吧 但有件事我不明白 我为每个技能创建 2 行 一行是空的 另一行是知识百分比 问题是 前两行的高度是我给出的笔画宽度的一半 其他线都有很好的高度 这是一个 jsbin http jsbin
  • 居中

    我的问题 http i56 tinypic com ff3jmo png http i56 tinypic com ff3jmo png 项目符号点未对齐 我要做的只是 text align center ing ul 所在的类 我可以对齐

随机推荐