canvas实现鼠标三角形,多边形区域绘制并下载图片

所需要的知识点:

  • let ctx = canvas.getContext(‘2d’); // 方法返回canvas 的上下文,如果上下文没有定义则返回 null
  • canvas.width; //canvas的宽
  • canvas.height; //canvas的高
  • new Image(); //函数将会创建一个新的HTMLImageElement实例
  • ctx .drawImage(),//绘制图像
  • ctx .beginPath(); //创建不同的路径
  • ctx.moveTo(0, 0);//移动画笔到起始点绘制一条线
  • ctx.lineTo();//画一条直线
  • ctx.stroke();//渲染线路
  • canvas.toDataURL()//方法返回一个包含图片展示的 data URI(下载图片返回base64)
  • ctx.clearRect() //清楚画布
    看更多canvasApi详情请到 这里

绘制图像的demo:

这里直接贴代码demo了,可直接运行,vue的话,稍微改一下变量的引用就行

<body>
    <button id="button">点击截屏</button>     [选择后鼠标双击保存线路]
  
    <div style="background-color: #ccc;width: 400px">
        <canvas id="canvas" style="background:url('http://t8.baidu.com/it/u=3571592872,3353494284&fm=79&app=86&f=JPEG?w=1200&h=1290');background-size: 100% 100%;"></canvas>
    </div>
    <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script>
        $(function() {
            var startdraw = false;
            
            var point = {
                x: 0,
                y: 0
            };
            var drawCanvas = document.getElementById('canvas');
            var ctx = drawCanvas.getContext('2d');
            drawCanvas.width = 400;
            drawCanvas.height = 300;

            var canvasOffset = $('#canvas').offset();     //获取x和y的偏移量{x:,y:}
            var arrlines = [];
            var arr = [];


            var num=0;

             $("#button").click(function(){
                console.log(num)
                console.log(arr)
                    let imgObj = new Image()
                    imgObj.src = 'http://t8.baidu.com/it/u=3571592872,3353494284&fm=79&app=86&f=JPEG?w=1200&h=1290'
                    imgObj.setAttribute("crossOrigin",'Anonymous')
                    imgObj.onload = function () {
                    ctx.drawImage(imgObj,0,0,drawCanvas.width,drawCanvas.height)
                    ctx.beginPath();

                    if (arr.length > 2) {
                            ctx.moveTo(arr[0].x, arr[0].y);
                            for (var i = 0; i < arr.length; i++) {
                                var p = arr[i];
                                ctx.lineTo(p.x, p.y);
                                //ctx.closePath();
                            }
                            ctx.lineTo(arr[0].x,arr[0].y);
                            ctx.stroke();
                        }
                    }
                    // 生成图片(图片的格式)
                    let t = setTimeout(()=>{
                            let imageUrl = drawCanvas.toDataURL("image/png");
                            console.log(imageUrl);
                            clearInterval(t)
                    },300)
                
              

             })

            $('#canvas').mousemove(function(e) {
                if (startdraw) {
                    ctx.clearRect(0, 0, drawCanvas.width, drawCanvas.height);
                    ctx.strokeStyle = 'blue';
                    ctx.lineWidth = 1;
                    ctx.beginPath();
                    if (arr.length > 0) {
                        ctx.moveTo(arr[0].x, arr[0].y);
                        for (var i = 0; i < arr.length; i++) {
                            var p = arr[i];
                            ctx.lineTo(p.x, p.y);
                            ctx.stroke();
                            //ctx.closePath();
                        }
                    }
                    if(num>1){
                        ctx.moveTo(point.x, point.y);
                        ctx.lineTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);

                        ctx.moveTo(arr[0].x, arr[0].y);
                        ctx.lineTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
                    }else{
                         ctx.moveTo(point.x, point.y);
                         ctx.lineTo(e.pageX - canvasOffset.left, e.pageY - canvasOffset.top);
                    }
                    ctx.stroke();
                }
            });

            $('#canvas').mousedown(function(e) {
                num++;
                ctx.beginPath();
                point = {
                    x: e.pageX - canvasOffset.left,
                    y: e.pageY - canvasOffset.top
                }
                arr.push(point);
                startdraw = true;
            });

            $("#canvas").dblclick(function(){
                if(arr.length-1<3){
                    alert('最少绘制三个点')
                    return;
                }
                startdraw = false;
                num--;
                arr.splice(arr.length-1,1)
                ctx.closePath();
            })

            $(window).mouseup(function(e) {
                // startdraw = false;
                // var obj = {
                //     x: e.pageX - canvasOffset.left,
                //     y: e.pageY - canvasOffset.top
                // };
                // arr.push(obj);
                // arrlines.push(arr);
                // arr = [];
                // console.log(arrlines);
            });
        });


    </script>

</body>

觉得不错的话点个赞,收藏一下哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值