H5 canvas绘制出现模糊的问题

在之前做移动端小游戏幸运转盘九宫格转盘,使用到了 canvas ,也是第一次在项目中使用 canvas 来实现。

近期测试人员反应 canvas 绘制的内容太模糊,心想着用 canvas 绘制出来的怎么会模糊,先前也有考虑到适配不同尺寸的移动设备,担心直接使用 img 或者设置 background 会使图片拉伸而变得模糊,所以使用 canvas 来绘制转盘与九宫格,精确的计算每个物体所在的坐标以及尺寸绘制出来的,怎么会模糊。

然而将绘制的内容与页面中的其他文字或者图片作对比后,发现使用 canvas 绘制输出的确实比直接使用标签输出的来的模糊,如下两张截图:

可以看出转盘中或者九宫格中的图片跟蚊子,明显与下面直接使用HTML标签显示的文字来的模糊。

在网上查了下 canvas 模糊的问题,确实存在,也有不少的解决方法。

有一种说法是说因为绘制的坐标不是整数级的坐标,所以会变得模糊,所以在计算坐标的时候可以使用 Math.floor 将坐标取整,这样绘制就会变得清晰。

个人觉得这种说法并不实际,因为在实现的时候就是要计算到每个点每条线的具体位置,角度等等的精确值,这样粗糙的取整,会使得绘制出来的整体跟设计图上有比较大的出入,而且本身也无法维护让每次绘制都是在整数级的坐标上,比如绘制一个圆,要如何让每个点都是在整数坐标的像素点上?

还有一种方法比较简单,容易实现,而且效果在目前看来还是不错的。

先补充说明一个基础知识点,在使用 canvas 的时候,要设置画布的大小,要使用的是 canvas 的 width 与 height 属性,而不是设置 canvas 的 style 或者CSS样式中的 width 与 height 。

因为在绘制的过程中画布内容的实际大小是根据 canvas 的 width 与 height 属性设置的,而 style 或者CSS设置的width 与 height 只是简单的对画布进行缩放。

这里可以将 canvas 比喻为一个 img ,其中画布的 width 与 height 属性,相当于 img 中图片的原始尺寸;我们使用JS在画布上绘制的内容对应的就是 img 中的图片;而 style 或者CSS设置的 width 与 height ,就是设置 canvas 或者 img 在页面上要显示的大小。

因此这里要解决模糊的做法,就是将这张“图片”变得高清一点,然后缩小了来显示。具体实现就是将画布的大小设置为实际显示大小的两倍,然后在canvas的css属性设置正常显示的宽高,比如,要显示一个100*200的画布,可以这样写:

<canvas width="200" height="400" style="width: 100px;height: 200px;"></canvas>

如此就相当于画了一张200*400的图片,然后设置他显示成100*200的大小,这样一来就变得清晰了。需要注意的是,这样将画布放大之后,绘制的过程中对应的那些坐标,长度等等都要相应的放大,比如原本在100*200的画布上绘制 ctx.arc(10,10,5,0,Math.PI*2) ,现在在200*400的画布上就得改成 ctx.arc(20,20,10,0,Math.PI*2) 。如此修改后的效果如下两张截图:

现在相比之前,明显清晰了许多,画布中的文字和图片与下面HTML标签直接输出的一样清楚,模糊的问题解决了,不会再觉得是撸多了,眼睛花。

另外,如果要比较好的解决canvas模糊的问题,可以使用JS类库 hidpi-canvas-polyfill 来解决,由于我也没试过,就不多说了,想了解的可以查看html5 canvas绘制图片模糊的问题,这里有介绍这个插件的使用方法。



原文链接:[总结归纳]H5 canvas绘制出现模糊的问题

This entry was posted in CANVASCSSH5 & CSS3HTMLHTML5JavaScriptJSWeb总结归纳 and tagged CANVASCSS,H5,HTML5,JSHTMLJavaScriptWEB总结归纳. Bookmark the permalink.

时间: 2024-10-07 06:14:24

H5 canvas绘制出现模糊的问题的相关文章

h5+canvas绘制动画时钟

h5+canvas绘制动画时钟 效果图,这个是截图,可以动的, 代码如下: <!DOCTYPE html><html><head><title>动画效果</title></head> <body> <canvas id="anm" width="600" height="600" style="border:1px solid gray"

Canvas绘制线条模糊的解决方案

前段时间,做一个跨平台app项目,需要绘制分时图和K线图.找了很多开源的js的图表库,包括echarts.highcharts等等,都不是很满意,原因有2: 1.太臃肿,我实际上只要一个分时和一个K线图表,最多搭配几个线形图 2.不满足需求.主要就是分时图,国内玩的js图表库,几乎都没有分时图.都是用1分钟线的收盘价线来做的,和中国股民的使用习惯完全不搭界. 多年前有人开源了一个js绘制股票图形的库,叫做html54stock,图像表现上很符合中国人的使用习惯,但是也有问题: 1.封装不好,很多

用h5中的canvas 绘制八卦图

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>canvas绘制八卦图</title> 6 </head> 7 8 <body> 9 <canvas id="canvas" width="600" height="500"><

用canvas绘制的饼状图,6等分,颜色随机

都说程序员懒,生活还是不能懒的,比如洗头.洗脸,当然也包括是分享咯.下面分享一下我用H5的新标签canvas绘制的饼状图,颜色是随机生成的,动态生成6等分,我还做了随机生成数据的, 配上文字,每份所占的比例就显而意见.,这点用在分析数据还是挺好的.图片如下; canvas 是 HTML5 提供的一个用于展示绘图效果的标签. canvas 原意画布, 帆布. 在 HTML 页面中用于展示绘图效果. 最早 canvas 是苹果提出的一个方案, 今天已经在大多数浏览器中实现.. 基本使用语法: 使用

canvas绘制清晰的方法

很早就开始使用canvas,包括自己绘制各种图形,以及作为画布提供给诸如echarts,当canvas绘制细线条,特别是关于文字绘制会出现很模糊或者锯齿的感觉. 1 <canvas ref="canvas" width="200" height="200"/> 正常情况下一般都是这么写的,但是实际上对于canvas来说,这个canvas.width canvas.height 与canvas.style.width canvas.st

HTML5—canvas绘制图形(1)

1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的“画布”,我们可以利用js脚本在“画布”上绘制图形. 1.1canvas元素 在利用canvas绘制图形之前,我们首先需要在页面中放置一个canvas元素,如下代码: <canvas id="mycanvas" width="400" height="40

167天:canvas绘制柱状图

canvas绘制柱状图 1.HTML 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 6 &l

(四)canvas绘制路径

save() 样式不受污染的起始范围 shadowOffsetX 阴影x轴的距离 shadowOffsetY 阴影y轴的距离 shadowBlur 模糊度 shadowColor 阴影颜色 restore() 保护样式不受污染的结束范围 clearRect() 可以理解为橡皮擦 参数四个:x轴,y轴,宽度,高度 清除整个画布:0,0,oC.width,oC.height <!doctype html> <html lang="en"> <head>

H5 Canvas 绘图

一.什么是Canvas Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas定义一个区域,可以由html属性定义该区域的宽高,JavaScript代码可以访问该区域,通过一整套完整的绘图功能(API),在网页上渲染动态效果图. 二.Canvas能做什么 游戏:毫无疑问,游戏在HTML5领域具有举足轻重的地位.HTML5在基于Web的图像显示方面比Flash更加立体.更加精巧. 图表制作:图表制作时常被人们忽略,但无论企业内部还是企业间交流合作都离不开图表.现在一些开发者使用HTM