最近项目中用的canvas 越来越多,但是之前都是在canvas 上画图片,
最近这次是做一个折线图,自己画出来以后发现有锯齿,百度一番后找到了解决办法,记录到博客里。

声明一下,我用的是第二种方法,第一种方法,看代码原理没问题,也就整理过来了

使用HTML5的canvas元素画出来的.在移动端手机上测试都发现画图有一点锯齿问题

出现这个问题的原因应该是手机的宽是720像素的, 而这个canvas是按照小于720像素画出来的, 所以在720像素的手机上显示时, 这个canvas的内容其实是经过拉伸的, 所以会出现模糊和锯齿.

解决方案一:

就是在canvas标签中设置了width=”200”,height=”200”之外, 还在外部的CSS样式表中设置了该canvas的宽度为100%,然后在画图时把canvas的的宽度设为手机端的最大像素值, 因为现在的手机端宽度的最大的只有1080像素宽, 所以就把canvas的宽度和高度设为200的6倍也就是1200像素, 按照这个像素画完之后, width:100%又会把canvas的宽度和高度缩小至父元素的宽和宽那么大, 因此整个canvas被缩小了, 大尺寸的canvas内容被缩小了之后肯定不会产生锯齿现象,解决的原理其实就是画图时候将canvas的宽和高放大一定的倍数,按照放大后的canvas宽和高画图,然后画完之后再将canvas缩小为目标宽和高,这样解决的方法存在的问题是,在PC端反而锯齿会更明白,只是移动端的效果很好,所以在pc端不需要放大倍数,实例如下:


<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><title>html5 canvas 画图移动端出现锯齿毛边的解决方法</title><style type="text/css">#canvas {width: 100%;}</style>
</head><body style="background: url(blue_bj.jpg);"><div style="width: 200px"><canvas id="canvas" width="200" height="200"></canvas></div>
</body></html>
<script type="text/javascript">
// 判断是移动还是pc
function IsPC() {var userAgentInfo = navigator.userAgent,Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"],flag = true;for (var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) {flag = false;break;}}return flag;
}
//PC端和移动端方法倍数的判断
var scale = 1;
if (!IsPC()) {scale = 6;
}
var canvas = document.getElementById("canvas");
var cxt = canvas.getContext("2d");
//画一个空心圆
cxt.beginPath();
canvas.width = canvas.width * scale;
canvas.height = canvas.height * scale;
cxt.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2 - scale * 16, 0, 360, false);
cxt.lineWidth = scale * 16;
cxt.strokeStyle = "#faff6d";
cxt.stroke();
cxt.closePath();
</script>

解决方案二:

使用window.devicePixelRatio设备上物理像素和设备独立像素(device-independent pixels (dips))的比例来设置canvas实际需要放大的倍数,原理与上一种方法一样,区别在于 devicePixelRatio取出的是实际的比例倍数,在pc端显示为1,避免了上种方法PC端不判断同样放大一样倍数画图出现明显锯齿问题,但是devicePixelRatio各个浏览器的兼容性不是很好,这是唯一缺陷,实现方法如下:

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><title>html5 canvas 画图移动端出现锯齿毛边的解决方法</title>
</head>
<body style="background: url(blue_bj.jpg);"><canvas id="canvas" width="200" height="200" ></canvas>
</body>
</html>
<script type="text/javascript">var canvas=document.getElementById("canvas");var cxt=canvas.getContext("2d");//画一个空心圆cxt.beginPath();var width = canvas.width,height=canvas.height;if (window.devicePixelRatio) {canvas.style.width = width + "px";canvas.style.height = height + "px";canvas.height = height * window.devicePixelRatio;canvas.width = width * window.devicePixelRatio;cxt.arc(canvas.width/2,canvas.height/2,canvas.width/2-16 * window.devicePixelRatio,0,360,false);cxt.lineWidth=16 * window.devicePixelRatio;cxt.strokeStyle="#faff6d";cxt.stroke();//画空心圆cxt.closePath();cxt.scale(window.devicePixelRatio, window.devicePixelRatio);}
</script>

如果是用jquery 的话,要把jquery 对象转换成dom 对象!比如
var canvas = $(“#mycanvas”);
canvas[0].style.width = width + ‘px’;

如果用 canvas.width(width+’px’);
这种方法不行,因为jq 获取的元素是一个集合, 必须要用 [0] 才能拿到dom 元素

canvas 画图移动端出现锯齿毛边的解决方法相关推荐

  1. html5 canvas 画图移动端出现锯齿毛边的解决方法

    html5 canvas 画图移动端出现锯齿毛边的解决方法 参考文章: (1)html5 canvas 画图移动端出现锯齿毛边的解决方法 (2)https://www.cnblogs.com/dear ...

  2. 移动端页面inputfile打不开_移动端input“输入框”常见问题及解决方法

    转自 https://www.cnblogs.com/ljx20180807/p/9837748.html 1. ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱: 当页input存在 ...

  3. html边框样式不对,科技常识:HTML5 canvas画矩形时出现边框样式不一致的解决方法...

    今天小编跟大家讲解下有关HTML5 canvas画矩形时出现边框样式不一致的解决方法 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关HTML5 canvas画矩形时出现边框样式不一致的解决 ...

  4. canvas生成图片toDataURL报错的原因和解决方法

    canvas生成图片toDataURL报错的原因和解决方法 参考文章: (1)canvas生成图片toDataURL报错的原因和解决方法 (2)https://www.cnblogs.com/suna ...

  5. 移动端input“输入框”常见问题及解决方法

    移动端input"输入框"常见问题及解决方法 参考文章: (1)移动端input"输入框"常见问题及解决方法 (2)https://www.cnblogs.co ...

  6. Android端App无法抓包解决方法——Drony

    Android端App无法抓包解决方法--安装Drony 1:安装drony (这里手机使用的Android设备) 2:开启代理抓包软件(Burpsuite) 3:配置drony转发 1:安装dron ...

  7. axios使用post请求服务端不能获取参数的解决方法

    项目中使用到axios作为ajax请求插件,用到post请求是常见的,诸如以下场景的一个普通的post请求: export function listManage(params) {     retu ...

  8. leaflet 在移动端地图显示不清晰的解决方法

    我们使用地图框架leaflet.js 的时候,在移动端会发现地图显示的文字这些有点模糊.只要把detectRetina这个属性设置为true  就可以完美的解决了.(加上不影响PC端) L.tileL ...

  9. 安装Mysql时端口号3306被占用,解决方法

    当我们在卸载mysql数据库重新安装的时候,会出现端口号3306被占用的情况 有两种解决方案: 一:可以不使用3306端口,也可以换成别的端口,如3307,3308等等 二:可以打开命令窗口 1.wi ...

最新文章

  1. 万人马拉松赛事,人脸识别系统如何快速、准确完成校验?
  2. 在html中使用thymeleaf编写通用模块
  3. ERROR in app.js from UglifyJs RangeError: Maximum call stack size exceeded
  4. 克隆复制可使用原型( Prototype)设计模式
  5. java重复造轮子系列篇-----时间date
  6. sql select
  7. JUSTCTF校赛安卓wp
  8. 最大并发连接数和最大会话数的区别
  9. 化工原理第四版课后习题答案
  10. Linux多线程之线程同步(条件变量)
  11. python作业题目用户输入行数、输出倒的等腰三角形_智慧职教云课堂APPPython程序设计(常州工业职业技术学院)作业期末考试答案...
  12. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
  13. JS记坑 ----- children返回的类数组
  14. python中列表操作
  15. 深入理解Python对象(源码深度解析)
  16. 怎么使用可视化数据库工具 DBeaver 连接本地数据库?
  17. Word交叉引用连续引用多个参考文献
  18. 一款好用的WEB版报表工具、报表设计器
  19. vtt或srt字幕挂载
  20. ASP.NET Core与ASP.NET区别

热门文章

  1. Spring系列——@lazy注解
  2. PHP接口限定ip访问curl,PHP---CURL 访问接口问题
  3. 修改手机状态栏字体的颜色(如:白底黑字)
  4. 道阻且长,行则将至;行而不辍,未来可期。
  5. 故障:不能 demote 域控制器
  6. android 高德地图poi搜索周边
  7. u盘启动pe一键装机的步骤教程,u盘如何安装系统
  8. 2015秋季腾讯【技术运营】岗位———在线笔试总结
  9. Matlab数字图像处理学习记录【1】——准备与基本原理
  10. android bks证书生成方式