在canvas元素中,是否通过lineto和arc方法实际将浮点数视为浮点数?

例如:

context.moveto(20.4562,80.8923);
context.lineto(120.1123,90.2134);
context.arc(24.5113,36.7989,20.123,Math.PI*2);

canvas是否真的支持浮点数坐标,或者它只是在绘制直线,圆弧,矩形等时将浮点数转换为整数?

解决方法

位图本身不支持浮点值.它只能处理整数值.画布的2D上下文主要处理每个SE未连接到位图的路径.

路径是任意的,仅作为向量内部存在.当它们被抚摸或填充时,它们会经历光栅化过程,即.转换为位图表示.

位图中的路径及其分配的点本身可以​​包含分数值,但位图不能.然而,可以使用内插(子像素)来表示小数值,这给出了具有更大的可用位图分辨率的印象,如果值减少到仅整数,则反过来消除锯齿状外观.

(并且分辨率是进行插值的主要方面.屏幕相当于72-96 DPI.如果屏幕具有更高的分辨率,300 DPI,则不需要插值,就像打印一样.但是我们现在在那里,如果没有使用插值作为缺乏分辨率的补偿,那么绘图看起来会很麻烦.

下面是它的工作原理

当像素落在整数边界值上时,将像素设置为该值的简单情况.

当你处理一个浮点时,没有在哪里设置一个像素,它必须向下舍入(落地)或放在下一个单元格(ceil’ed),即. 3.2变为3,3.7变为4等

插值/子像素

然而,几十年前有人提出这个想法,将小数部分表示为实际像素和下一个像素之间的混合.

如果像素值为3.5,则小数部分将代表50%的黑色和50%的白色.它仍将占据整个像素单元,但由于它非常小,所以由于周围像素导致幻觉,它看起来只占据其细胞的一小部分.

所以在这种情况下,最后一个像素集看起来像这样:

如果值为3.25,则只有25%的剩余像素会混合,使得最后一个像素看起来像:

这将适用于落在小数值上的所有像素.当您绘制对角线并且某些点“交叉”两个像素时,这些点的混合将应用于基于闭合整数的放置,使得线条看起来平滑.

现在,在画布的情况下,使用alpha通道插入形状.然后使用Porter-Duff将形状与现有内容混合并合成,这就是我们所看到的最终结果.

在性能方面,这也是需要考虑的因素.如果需要插值,则成本上升,对于每个像素,浏览器(或子系统)必须计算分数表示.因此,您可以确保在将整数值传递给路径方法之前将其四舍五入.这当然不适用于弧形,椭圆形,某些角度的对角线等,但在某些情况下它可以帮助加快速度.

这是插值原理,适用于使用分数坐标时.然而,插值和子像素有更复杂的方式.在现代世界中,2×2或4×4采样更常见,可以提供更准确的结果.

演示

如果我们做一个小的放大线,当我们改变分数值时,我们可以看到线的末端“淡入淡出”.

这条线是3像素宽,然后我们在[0,1]之间添加一个分数值,我们可以看到最后一个ceil’ed像素正在重新采样:

var ctx = document.querySelector("canvas").getContext("2d"),x = 3.1,dx = 0.1;

ctx.imageSmoothingEnabled = ctx.mozImageSmoothingEnabled = ctx.webkitimageSmoothingEnabled = false;
ctx.font = "14px sans-serif";

(function loop() {
  ctx.fillStyle = "#000";
  ctx.clearRect(0,350,50);
  ctx.fillRect(0,x,1); // forces pixel-alignment for demo

  ctx.drawImage(ctx.canvas,4,1,200,50);
  
  x += dx;
  if (x <= 3 || x >= 4) dx = -dx;

  info(x);
  document.querySelector("div").innerHTML = "length: " + x.toFixed(2);
  
  setTimeout(loop,160)
})();

function info(x) {
  ctx.fillStyle = "#f00";

  ctx.fillText("Perceived length",210,19);
  ctx.fillRect(0,15,x * 50,2);
  ctx.fillRect(x*50-1,12,2,7);

  x = x === 3 ? 3 : 4;
  ctx.fillText("Actual length",40);
  ctx.fillRect(0,35,32,7);
}
div {font:bold 14px sans-serif}
<canvas width=500 height=50></canvas><br>
<div></div>

html5 – 绘制直线或圆弧时画布是否支持浮点数?的更多相关文章

  1. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 详解HTML5中的picture元素响应式处理图片

    这篇文章主要介绍了详解HTML5中的picture元素响应式处理图片,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas像素点操作之视频绿幕抠图

    这篇文章主要介绍了canvas像素点操作之视频绿幕抠图的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  5. HTML5拖拽功能实现的拼图游戏

    本文通过实例代码给大家介绍了HTML5拖拽功能实现的拼图游戏,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

  6. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. 使用Html5多媒体实现微信语音功能

    这篇文章主要介绍了使用Html5多媒体实现微信语音功能,需要的朋友可以参考下

  8. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  9. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 使用HTML5做的导航条详细步骤

    这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. H5最强接口之canvas实现动态图形功能

    这篇文章主要介绍了H5最强接口之canvas实现动态图形功能,需要的朋友可以参考下

  4. Canvas高级路径操作之拖拽对象的实现

    这篇文章主要介绍了Canvas高级路径操作之拖拽对象的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. html5视频自动横过来自适应页面且点击播放功能的实现

    这篇文章主要介绍了h5视频自动横过来自适应页面且点击播放,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. 详解HTML5中的picture元素响应式处理图片

    这篇文章主要介绍了详解HTML5中的picture元素响应式处理图片,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. canvas像素点操作之视频绿幕抠图

    这篇文章主要介绍了canvas像素点操作之视频绿幕抠图的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  9. canvas绘制视频封面的方法

    这篇文章主要介绍了canvas绘制视频封面的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. HTML5拖拽功能实现的拼图游戏

    本文通过实例代码给大家介绍了HTML5拖拽功能实现的拼图游戏,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

返回
顶部