详解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 相关文章推荐
纯CSS实现预加载动画效果
Sep 06 HTML / CSS
纯css3(无图片/js)制作的几个社交媒体网站的图标
Mar 21 HTML / CSS
CSS实现限制字数功能当对象内文本溢出时显示省略标记
Aug 20 HTML / CSS
CSS3 中的@keyframes介绍
Sep 02 HTML / CSS
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
Apr 26 HTML / CSS
让IE支持HTML5的方法
Dec 11 HTML / CSS
html5弹跳球示例代码
Jul 23 HTML / CSS
带你认识HTML5中的WebSocket
May 22 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
Sep 21 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
Mar 26 HTML / CSS
HTML基础详解(上)
Oct 16 HTML / CSS
CSS使用SVG实现动态分布的圆环发散路径动画
Dec 24 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(1)
2006/10/09 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
python调用cmd命令行制作刷博器
2014/01/13 Python
Python中实现对list做减法操作介绍
2015/01/09 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
python使用tornado实现登录和登出
2018/07/28 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
劳动之星获奖感言
2014/02/01 职场文书
人事部岗位职责范本
2014/03/05 职场文书
生物技术专业求职信
2014/06/10 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
成绩单家长意见
2015/06/03 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书