详解Html5 Canvas画线有毛边解决方法


Posted in HTML / CSS onMarch 01, 2018

Html5 Canvas 所有的画线指令画出来的线条都有毛边(比如 lineTo, arcTo,strokeRect),这是因为在Canvas中整数坐标值对应的位置恰巧是屏幕象素点中间的夹缝,那么当按这样的坐标进行线条渲染时所要用到的就是夹缝两边的象素点,这样即便设置了lineWidth为1也将看到两个象素效果的线条,解决方法原象素点+0.5进行偏移。

下面是处理前后的效果比较:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>canvasTest</title>  
    <script type="text/javascript" src="http://www.pyzy.net/Demo/html5_cancas_js/excanvas.js"></script>  
    <script type="text/javascript">  
        var MyCanvas = function(boxObj, width, height) {  
            //序号、计数  
            this.index = arguments.callee.prototype.Count = (arguments.callee.prototype.Count || 0) + 1;  
            var cvs = document.createElement("canvas");  
            cvs.id = "myCanvas" + this.index;  
            cvs.width = width || 800;  
            cvs.height = height || 600;  
            (boxObj || document.body).appendChild(cvs);  
            //excanvas框架中针对ie加载canvas延时问题手动初始化对象  
            if (typeof G_vmlCanvasManager != "undefined") G_vmlCanvasManager.initElement(cvs);  
            //2D画布对象  
            this.ctx = cvs.getContext("2d");  
            /* * 绘制线条  
            * @ops JSON对象,可按实际支持属性扩展,示例:  { lineWidth:1,strokeStyle:'rgb(255,255,255)' }        
            * @dotXY:{ x:0, y:0 } ||[{ x:0, y:0 },{ x:0, y:0 }]  
            */  
            this.drawLine = function(dotXY, ops) {  
                this.ctx.beginPath();   
                for (var att in ops) this.ctx[att] = ops[att];  
                dotXY = dotXY.constructor == Object ? [dotXY || { x: 0, y: 0}] : dotXY;  
                this.ctx.moveTo(dotXY[0].x, dotXY[0].y);  
                for (var i = 1, len = dotXY.length; i < len; i++) this.ctx.lineTo(dotXY[i].x, dotXY[i].y);  
                this.ctx.stroke();  
            };  
        };  
        window.onload=function(){  
            var c1 = new MyCanvas();  
            c1.drawLine([{ x: 10, y: 10 }, { x: 10, y: 200 }],{lineWidth:2,strokeStyle:'rgb(0,0,0)'});  
            c1.drawLine([{ x: 11, y: 10 }, { x: 11, y: 200 }],{lineWidth:2,strokeStyle:'rgb(255,255,255)'});  
            c1.drawLine([{ x: 100, y: 10 }, { x: 100, y: 200 }],{lineWidth:1,strokeStyle:'rgb(0,0,0)'}); //普通线  
            c1.drawLine([{ x: 200.5, y: 10 }, { x: 200.5, y: 200 }],{lineWidth:1,strokeStyle:'rgb(0,0,0)'}); //+0.5偏移  
   
        }  
     
    </script>  
</head>  
<body>  
↓ 处理的↓ 普通的
↓ +0.5偏移的<br />  
</body>  
</html>

详解Html5 Canvas画线有毛边解决方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
移动Web—CSS为Retina屏幕替换更高质量的图片
Dec 24 HTML / CSS
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
Jan 23 HTML / CSS
实现CSS3中的border-radius(边框圆角)示例代码
Jul 19 HTML / CSS
CSS3实现的炫酷菜单代码分享
Mar 12 HTML / CSS
css3实现圆锥渐变conic-gradient效果
Feb 12 HTML / CSS
解决img标签上下出现间隙的方法
Dec 14 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
Dec 26 HTML / CSS
Html5中的桌面通知Notification的实现
Sep 25 HTML / CSS
socket.io 和canvas 实现的共享画板功能
May 22 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
Sep 06 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
Feb 14 HTML / CSS
CSS实现两列布局的N种方法
Aug 02 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
Mar 05 #HTML / CSS
利用html5 file api读取本地文件示例(如图片、PDF等)
Mar 07 #HTML / CSS
html5 分层屏幕适配的方法
Mar 16 #HTML / CSS
canvas实现图片马赛克的示例代码
Mar 26 #HTML / CSS
HTML5 拖拽批量上传文件的示例代码
Mar 28 #HTML / CSS
利用html5 canvas动态画饼状图的示例代码
Apr 02 #HTML / CSS
简单聊聊H5的pushState与replaceState的用法
Apr 03 #HTML / CSS
You might like
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP遍历目录文件的常用方法小结
2017/02/03 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
详解React的回调渲染模式
2020/09/10 Javascript
Python入门篇之对象类型
2014/10/17 Python
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python简明入门教程
2015/08/04 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
使用Python写个小监控
2016/01/27 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python十进制转二进制的详解
2020/02/07 Python
基于Python的OCR实现示例
2020/04/03 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
Python 实现集合Set的示例
2020/12/21 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
教师职称自我鉴定
2014/02/12 职场文书
会计毕业生自荐书
2014/06/12 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
财务个人年度总结范文
2015/02/26 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python