5

一、如何正确设置canvas尺寸?

Canvas有两种width、height:
1、一种是width、height属性,一般称其为画布尺寸,即图形绘制的地方。默认值分别为300px、150px。
例:
<canvas id="canvas" width="300" height="300">
2、另一种是css样式里的width、height属性,可通过内联样式、内部样式表或外部样式表设置。一般称其为画板尺寸,用于渲染绘制完成的图形。默认值为空。
例:
<canvas id="canvas" style="width:300px; height:300px;">
或:

<style>
    #canvas {
       width:300px;
       height:300px;
    }
</style>

如果设置了画布尺寸,未设置画板尺寸,或者两者都未设置,那么画板尺寸随画布尺寸改变。
但若设置了画板尺寸,而未设置画布尺寸,或者分别设置了,那么画板尺寸将不再随画布尺寸而改变。如果两者设置的尺寸不一样时,就会产生一个问题,渲染时画布要通过缩放来使其与画板尺寸一样,那么画布上已经绘制好的图形也会随之缩放,随之导致变形失真。
例:
<canvas id="canvas" style="width:200px; height:200px;">

<script>
    var canvas=document.getElementById('canvas');  
    var context=canvas.getContext('2d');
    context.beginPath();
    context.moveTo(0,0);
    context.lineTo(200,200);              
    context.stroke();
</script>

最终显示结果,在画板(200X200)上渲染的图形:
图片描述
在画布(300X150)上绘制的图形:
图片描述
显然,画布上的图形在渲染时变形了。
为了避免发生这种情况,保持画布尺寸和画板尺寸一致。

二、如何在高分辨率屏幕上清晰显示canvas图形?

上面说过,避免图形变形失真,要保持画布尺寸和画板尺寸一致。这只是针对分辨率不高的设备而言,其devicePixelRatio为1。而高分辨率屏幕,它的devicePixelRatio大于1。
canvas绘制的图形是位图,即栅格图像或点阵图像,当将它渲染到高清屏时,会被放大,每个像素点会用devicePixelRatio的平方个物理像素点来渲染,因此图片会变得模糊。

解决方法如下:
例:
<canvas id="my-canvas" style="width:200px; height:200px;"></canvas>
将画布尺寸设置为画板尺寸的window.devicePixelRatio倍:

var canvas=document.getElementById('canvas');    
canvas.width=canvas. clientWidth*window.devicePixelRatio;
canvas.height=canvas.clientHeight*window.devicePixelRatio;   

注意:样式设置的width是的元素内容宽度,不包括内边距、边框、外边距的,而clientWidth包括内边距,不包括边框、外边距、滚动条的(如果有)。
var context=canvas.getContext('2d');

绘制图形有两种方式:
1、 每一个绘制都相应的放大

context.beginPath();
context.moveTo(0,0);
context.lineTo(200*window.devicePixelRatio,200*window.devicePixelRatio);
context.lineWidth=context.lineWidth*window.devicePixelRatio; 
context.stroke(); 

2、用scale()缩放后再绘制

context.scale(window.devicePixelRatio,window.devicePixelRatio);
context.beginPath();
context.moveTo(0,0);
context.lineTo(200,200);
context.stroke();


lavender
27 声望2 粉丝