原图:
效果图:
是HTML5中重要的元素,和audio、video元素类似完全不需要任何外部插件就能够运行。Canvas中文翻译就是”画布”.它提供了强大的图形的处理功能(绘制,变换,像素处理…)。但是需要注意,canvas 元素本身并不绘制图形,它只是相当于一张空画布。如果开发者需要向 canvas 上绘制图形,则必须使用 JavaScript 脚本进行绘制。
菜鸟教程
Canvas 基础
<el-main style="background-color: #f8f8f9 ">
<div class="align-center mb-10">
<el-button type size="medium" @click="handleAdjustSize(0.75)">缩小1.5倍</el-button>
<el-button type size="medium" @click="handleAdjustSize(0.5)">缩小2倍</el-button>
<el-button type size="medium" @click="handleAdjustSize(1.5)">放大1.5倍</el-button>
<el-button type size="medium" @click="handleAdjustSize(2)">放大2倍</el-button>
</div>
<img
:src="src"
:width="imageListData.imageWidth"
:height="imageListData.imageHeight"
class="absolute"
alt
/>
<canvas
id="myCanvas"
:width="imageListData.imageWidth"
:height="imageListData.imageHeight"
style="position:absolute"
></canvas>
</el-main>
js代码:
//初始化
initCanvas() {
let canvas = document.getElementById('myCanvas')
let ctx = canvas.getContext('2d')
ctx.strokeStyle = 'red'
let pointsLength = this.points.length
ctx.moveTo(this.points[0][0], this.points[0][1]) //起点
this.points.forEach(val => {
ctx.lineTo(val[0], val[1])
}) //根据坐标点连接成线
let lastPointX = this.points[pointsLength - 1][0] //最后一个点的坐标x
let lastPointY = this.points[pointsLength - 1][1] //最后一个点的坐标y
ctx.lineTo(lastPointX + 50, lastPointY - 50)
ctx.lineTo(lastPointX + 80, lastPointY - 50)
ctx.stroke()
//开始画圆
ctx.fillStyle = 'red'
ctx.beginPath()
ctx.arc(
lastPointX + 100,
lastPointY - 50,
20,
-lastPointX - 100,
2 * Math.PI
)
ctx.fill()
ctx.closePath()
ctx.fillStyle = '#fff'
ctx.font = '14px Arial'
ctx.fillText('零值', lastPointX + 85, lastPointY - 45)
},
坐标点:
points: [],
newPoints: [
[119, 261],
[118, 262],
[118, 272],
[117, 273],
[117, 276],
[113, 280],
[102, 280],
],//部分坐标
imageListData: {
imageHeight: 480,
imageWidth: 640
}, //图片的大小
picSize: {
maxSize: '', //放大的尺寸
minSize: '' //缩小的尺寸
} //图片的尺寸
调用方法:
this.handleAdjustSize(1)
//调整结果的大小
handleAdjustSize(size) {
this.points = []
//调整图片和帆布的大小
this.imageListData.imageWidth *= size
this.imageListData.imageHeight *= size
//调整坐标点的大小
this.newPoints.forEach(val => {
val[0] *= size
val[1] *= size
this.points.push([val[0], val[1]])
})
setTimeout(() => {
this.initCanvas();
}, 100);//解决动态改变canvas宽度之后渲染元素,会导致渲染失败
},
1.由于canvas每当高度或宽度被重设时,画布内容就会被清空,因此可以通过重置画布的宽高来清空:
function clearCanvas()
{
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
c.height=c.height;
}
2.使用clearRect方法:
function clearCanvas()
{
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.clearRect(0,0,c.width,c.height);
}
3.类似于方法2,可以用某一特定颜色填充画布,从而达到清空的目的:
function clearCanvas()
{
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#000000";
cxt.beginPath();
cxt.fillRect(0,0,c.width,c.height);
cxt.closePath();
}
参考链接:html5清空画布方法
动态改变宽度的时候,就会清空画布,清空画布的时候,canvas重新渲染就会出现问题。
这里表现出来的问题就是需要再次点击查看图片,才会出现对应的放大缩小绘制出来的效果的功能。
解决方法:
动态改变canvas宽度之后渲染元素,会导致渲染失败。。。加个定时器就好了
setTimeout()
延时加载下。。我用的是100毫秒完全没问题
多写几个if判断也是没问题的
setTimeout(() => {
this.initCanvas();
}, 100);//解决动态改变canvas宽度之后渲染元素,会导致渲染失败
参考链接:canvas动态改变宽度导致canvas渲染失败