宽高问题
Canvas有两个宽高一个是dom的宽高,一个是画布的宽高。
1 | <canvas class="mycanvas" width="800" height="600"></canvas> |
但是样式里面
1 | .mycanvas{ |
我们绘制的时候就要按照 800 x 600
来计算去绘制
在JS中这样设置
1 | var oCanvas = document.querySelector(".mycanvas"); |
但是如果我们不定义画布的宽高,那么他就会使用默认的宽高
canvas默认宽是300px,默认高是150px
清晰度问题
但是我们把画布的宽高设置和DOM的宽高一样的话,在高像素比例的显示器上就会模糊,这里就要用到devicePixelRatio
了。
devicePixelRatio属性
该 Window 属性 devicePixelRatio 能够返回当前显示设备的物理像素分辨率与 CSS 像素分辨率的比率。此值也可以解释为像素大小的比率:一个 CSS 像素的大小与一个物理像素的大小的比值。简单地说,这告诉浏览器应该使用多少个屏幕的实际像素来绘制单个 CSS 像素。
1 | let devicePixelRatio = window.devicePixelRatio; |
要保证绘制的图形高清就要
DOM的宽高 * devicePixelRatio
这里注意了在VUE项目中一定要在$nextTick()
的回调中获取DOM的宽高否则获取到的都是0。
1 | let canvas = this.$refs["audio_canvas"]; |
Canvas画图
绘制圆角的方向
JavaScript 语法:
1 | context.arc(x,y,r,sAngle,eAngle,counterclockwise); |
参数值
参数 | 描述 |
---|---|
x | 圆的中心的 x 坐标。 |
y | 圆的中心的 y 坐标。 |
r | 圆的半径。 |
sAngle | 起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。 |
eAngle | 结束角,以弧度计。 |
counterclockwise | 可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。 |
绘制圆角矩形
1 | /**该方法用来绘制一个有填充色的圆角矩形 |
根据声音绘制声音图
HTML
1 | <canvas class="mycanvas" id="mycanvas"></canvas> |
CSS
1 | .mycanvas { |
JS
1 | let mycanvas = document.getElementById("mycanvas"); |
注意
window.devicePixelRatio
能够获取系统的缩放比率,画布的宽高乘以该值能够显著提升图片的清晰度。
Canvas转图片地址
语法
1 | canvas.toDataURL(type, encoderOptions); |
参数
type
可选图片格式,默认为
image/png
另外可选image/jpeg
或image/webp
。encoderOptions
可选在指定图片格式为
image/jpeg
或image/webp
的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值0.92
。其他参数会被忽略。image/png
时该参数无效,可以不传。
返回值
示例
1 | let img = new Image(); |
绘制另一个canvas图片
1 | this.preview_ctx.clearRect(0, 0, this.preview_canvas.width, this.preview_canvas.height); |
但是显示效果不好
推荐下面的这种方式
1 | if (this.preview_ctx) { |
图片旋转
1 | //旋转方法 |
返回的ImageData
对象中存储着canvas对象真实的像素数据,
它包含以下几个只读属性:
width
height
图片高度,单位是像素
data
Uint8ClampedArray
类型的一维数组,包含着RGBA格式的整型数据,范围在0至255之间(包括255)。
图片数据
1 | var oCanvas = document.querySelector(".origin_image"); |
注意
放置图片数据之前要设置画布的宽高
示例:
1 | oWidth = imageData.width; |
图片绘制工具类
1 | oCanvas.onmousedown = function (e) { //canvas上按下鼠标事件 |
注意
鼠标事件获取的位置是相对于DOM的,在绘制的时候要注意。
在做图片缩放的时候
定位的坐标要除以缩放的比例。