利用vue+fabric.js获取图片坐标,并实现图片拖拽、旋转、拉伸等功能

  • Post author:
  • Post category:vue


什么是Fabric.js?

Fabric.js是一个可以简化Canvas程序编写的库。 Fabric.js为Canvas提供所缺少的对象模型, svg parser, 交互和一整套其他不可或缺的工具。

为什么要使用Fabric.js?

Canvas提供一个好的画布能力, 但是Api不够友好。绘制简单图形其实还可以, 不过做一些复杂的图形绘制, 编写一些复杂的效果,就不是那么方便了。Fabric.js就是为此而开发,它主要就是用对象的方式去编写代码。

起步

Vue项目中引入Fabric.js

假设您的项目中正在使用ES6和Webpack,您可以开始使用Fabric.js,如下所示:

1、在命令行中:

npm install fabric(或yarn add fabric)

2、将其引入

.vue

文件中

import { fabric } from 'fabric'

3、在

.vue

的单文件中的

mounted:

生命周期里开始你的Fabric.js之旅啦

注:默认的fabric npm模块产生了相当大的包,如果Fabric.js中您有很多可能不需要的包,在这种情况下,可以在 在此处 或在命令行中构建你自己的版本。

绘制图片

1、在组件上添加一个带有id的canvas

<canvas id="c"></canvas>

2、初始化画布

this.canvasObj = new fabric.Canvas('c',{
                preserveObjectStacking:true // 禁止选中图层时自定置于顶部
});
this.canvasObj.setWidth(this.caWidth); //设置画布宽度
this.canvasObj.setHeight(this.caHeight); //设置画布高度

3、添加图形至画布

setImage: function (imgname) {
                let imgCoord = fabric.Image.fromURL(imgname, (img) => {
                    img.scale(1).set({
                        left: 150,
                        top: 150,
                        angle: -15
                    });
                    this.canvasObj.add(img).setActiveObject(img);
                });
 }

至此图形已经添加到画布里面去啦,接下来是要获取图形的XY坐标

通过fabric.js提供的getObjects()方法即可获取到图形对象的所有信息,fabric.js会以数组的形式按照图片先后层次将图片返回出来,在此我只需拿到图片的上右下左四个角的坐标

getImg: function () {
                this.imgcoordinate = [];
                let items = this.canvasObj.getObjects();
                items.forEach((item, index) => {
                    let itemcoord = {
                        floorIndex: index,
                        tl: {
                            x: item.aCoords.tl.x,
                            y: item.aCoords.tl.y
                        },
                        tr: {
                            x: item.aCoords.tr.x,
                            y: item.aCoords.tr.y
                        },
                        bl: {
                            x: item.aCoords.bl.x,
                            y: item.aCoords.bl.y
                        },
                        br: {
                            x: item.aCoords.br.x,
                            y: item.aCoords.br.y
                        }
                    };
                    this.imgcoordinate.push(itemcoord);
                });
}

至此就可以将图片的坐标信息全部获取到,如果需要改变图片的层次以及删除图片还可以往下看

// 移动层次
moveActive: function (index) {
                let t = this.canvasObj.getActiveObject();
                switch (index) {
                    case 0:
                    t.sendBackwards(); //向下一层
                    break;
                    case 1:
                    t.sendToBack();  //向下至底层
                    break;
                    case 2:
                    t.bringForward();  //向上一层
                    break;
                    case 3:
                    t.bringToFront();   //向上至顶层
                    break;
                    case 4:
                    this.canvasObj.remove(t);   //删除图片
                    break;
                    default:
                    return
                }
},

如果想要将生成图片并下载,可以将生成的图片信息绑定到一个<a>标签,再模拟点击下载

domeLode: function(){
       let url = this.canvasObj.toDataURL();
       $('<a>').attr({href:url,download:'a.png'})[0].click();
}

看下最终效果图



版权声明:本文为weixin_42252416原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。