仿写一个设计编辑器第二天

84 阅读2分钟

仿写一个设计编辑器第二天

绘制文本和文本框

使用 new fabric.IText()生成一个文本实例,new fabric.Textbox()生成文本框实例,再通过canvas.add()把实例绘制到画布

// 插入文本
addText() {
    const text = new this.fabric.IText("三体", {
        ...defaultPosition,
        fontSize: 40,
        id: uuid(),
    });
    this.canvas.c.add(text);
    this.canvas.c.setActiveObject(text);
},

截屏2022-10-24 23.45.24.png

绘制SVG文件

通过 fabric.loadSVGFromURL()加载svg文件,在其中使用fabric.utile.groupSVGElemet()把svg文件组合给,在其中使用 uuid()给每个svg文件一个唯一的标识 再通过 canvas.add()把svg图像绘制到画布上

addItem(e) {
    const url = e.target.src;
    
    // loadSVGFromURL中回调函数返回路径的文件,svg是由许多物件组合而成,
    this.fabric.loadSVGFromURL(url, (objects, options) => {
    // 使用 this.fabric.util.groupSVGElemnt()把svg的各部分组合起来,并给svg图片设置唯一标识和位置
    let item = this.fabric.util.groupSVGElements(objects, {
        ...options,
        ...defaultPosition,
        id: uuid(),
        name: "svg元素",
    });
    this.canvas.c.add(item);
    this.canvas.c.renderAll();
});
},

截屏2022-10-25 00.01.36.png

改变画布尺寸

使用Element-ui的计数器组件 el-input-number,watch中监听width和height的大小,使用canvas.setWidth()和setHeight()改变画布的大小

    // 设置画布宽度
    widthNum() {
        this.canvas.c.setWidth(this.widthNum);
        this.canvas.c.renderAll();
    },

    // 设置画布高度
    heightNum() {
        this.canvas.c.setHeight(this.heightNum);
        this.canvas.c.renderAll();
    },
}

截屏2022-10-25 00.06.44.png

给背景填充颜色

使用Element-ui的颜色选择器 ColorPicker 在watch中监听颜色值的变化,使用canvas.setBackgroundColor()填充画布颜色

color() {
    this.canvas.c.setBackgroundColor(this.color);
    this.canvas.c.renderAll();
},

截屏2022-10-25 00.09.54.png

设置背景图片

使用Element-ui的upload组件上传图片文件,不过文件不上传到服务器,通过upload组件的钩子函数before-upload可以在函数参数中拿到上传图片的数据,使用 FileReader解析文件返回一个图片地址,让后生成一个图片实例,在使用方法复制该图片元素,使用 canvas.setBackgroundImage()设置背景图片

// 拿到上传的图片

handleUpload(file) {
    getImgStr(file).then((res) => {
        this.imgFile = res;
    });
},

// 创建图片
createImg() {
    let imgEle = document.createElement("img");
    imgEle.src = this.imgFile;
    document.body.appendChild(imgEle);
    imgEle.onload = () => {
    this.setBgImg(imgEle);
    imgEle.remove();
};

},

// 设置背景
setBgImg(img) {
    const imgEle = img.cloneNode();
    imgEle.onload = () => {
        // 可跨域设置
        const imgInstance = new this.fabric.Image(imgEle, {
        crossOrigin: "anonymous",
    });
    
    // 渲染背景
    this.canvas.c.setBackgroundImage(
        imgInstance,
        this.canvas.c.renderAll.bind(this.canvas.c),
        {
        scaleX: this.canvas.c.width / imgInstance.width,
        scaleY: this.canvas.c.width / imgInstance.width,
        }
);
this.canvas.c.renderAll();
this.canvas.c.requestRenderAll();
};
},

//utils中的解析文件的方法
export function getImgStr(file) {
    return new Promise((resolve, reject) => {
    try {
        const reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onload = () => {
        resolve(reader.result)
    }
    }.catch (error) {
        reject(error)
    }
   })

}

截屏2022-10-24 21.28.15.png