likes
comments
collection
share

Fabric.js 有手就行,面试官硬要问我会不会背景 最近在投递简历的时候发现,很多HR在哪儿问,你会不会fabric

作者站长头像
站长
· 阅读数 20

背景

最近在投递简历的时候发现,很多HR在哪儿问,你会不会fabric.js啊;我说我暂时没看过,但是应该不难,看哈文档就能上手了。HR跟我说:“那你可能不太适合我们,祝你早日找到工作。”

咦,我这暴脾气...

写了一个简单的教程,大家可以根据到学习学习。

技术栈

我是用vite + vue3 搭建的项目。切记这是vue3,因为这儿在后续会出现一个问题。

绘制一个矩形

绘制一个简单的矩形。


<canvas id="canvas" width="400" height="400"></canvas>

import { fabric } from 'fabric';

canvas.value =  new fabric.Canvas('canvas', {
  // centeredScaling: true, // 全局所有元素都生效
  // uniformScaling: true // 单个元素生效
  preserveObjectStacking: true,
}),

const rect: any = new fabric.Rect({
    left: 100,
    top: 100,
    fill: 'red',
    width: 120,
    height: 120,
    z: 10,
});

// 将矩形添加到画布上
canvas.value.add(rect);

注意注意注意...

如果你用的是vue3搭建的项目,这样写可能会有问题。我查了很多资料才发现,需要这样修改,这是示例:

import { markRaw } from 'vue';
import * as fabric from 'fabric';

canvas.value = markRaw(
    new fabric.Canvas('canvas', {
      // centeredScaling: true, // 全局所有元素都生效
      // uniformScaling: true // 单个元素生效
      preserveObjectStacking: true,
    }),
);

绘制圆形、三角形等等原理都是一样的,大家可以自己学,并且去看看官方网站的参数,有许多有用的参数比如: angle(角度),opacity(透明度)等等。官方文档-只有英文 | 中文文档,如果你们有更好的可以推荐我修改 | 可以参考文档

图片的渲染方式

既然是canvas那么肯定是要用到图片的,而且可能有很多操作图片的情况,那我们怎么添加图片呢?

【第一种方法:不推荐】

// 限制上传图片
<input
  id="avatar-upload-input"
  style="display: none"
  accept="image/png, image/jpeg, image/jpg"
  type="file"
  @change="changeInput"
/>

// 上传图片
const changeInput = (event: any) => {
  // 获取文件
  let file = event.target.files[0];
  // 图片base64
  const reader = new FileReader();

  if (file) {
    reader.onload = (e: any) => {
      console.log(e.target.result);
      const dataUrl = e.target.result;
      const imgElement = document.createElement('img');
      imgElement.src = dataUrl;
      imgElement.onload = () => {
        const img: any = renderImages(dataUrl);
        canvas.value.add(img);
        img.scaleToWidth(400);
        // canvas.value.viewportCenterObject(img);
        canvas.value.renderAll();
      };
    };
  }
  // 读取文件
  reader.readAsDataURL(file);
};

const renderImages = (result: string) => {
  const imgElement = document.createElement('img');
  imgElement.src = result;

  return new fabric.Image(imgElement, {
    left: 0,
    top: 0,
    angle: 0,
    opacity: 1,
    centeredScaling: true, // 单个元素生效
    crossOrigin: 'Anonymous',

    hasControls: false,
    hasBorders: false,
    selectable: false,
    lockMovementX: false,
    lockMovementY: false,
    lockScalingX: false,
    lockScalingY: false,
  });
};

【第二种方法:推荐】

通过上传图片获取到的base64然后通过Image加载图片。

<input
  id="avatar-upload-inputs"
  style="display: none"
  accept="image/png, image/jpeg, image/jpg"
  type="file"
  @change="changeInputs"
/>

const changeInputs = (event: any) => {
  // 获取文件
  let file = event.target.files[0];
  // 图片base64
  const reader = new FileReader();

  if (file) {
    reader.onload = (e: any) => {
      console.log(e.target.result);
      const dataUrl = e.target.result;
      fabric.Image.fromURL(dataUrl).then((img: any) => {
        img.scaleToWidth(400);
        canvas.value.add(img);
      });
    };
  }
  // 读取文件
  reader.readAsDataURL(file);
};

【第三种方式:推荐】

加载静态图片。

const selectProfilePicture = (picture: string) => {
  const img: any = canvas.value.getObjects()[0];

  if (img) {
    canvas.value.remove(img);
    fabric.Image.fromURL(getImageUrl(picture)).then((img: any) => {
      img.scaleToWidth(400);
      canvas.value.add(img);
    });
  } else {
    fabric.Image.fromURL(getImageUrl(picture)).then((img: any) => {
      img.scaleToWidth(400);
      canvas.value.add(img);
    });
  }
};

const getImageUrl = (name: string) => {
  return new URL(`../images/${name}`, import.meta.url).href;
}

如果想修改一些参数的话,可以用一下方式。

fabric.Image.fromURL(getImageUrl(picture)).then((img: any) => {
  img.scaleToWidth(400);
  img.set({
    left: 100,
    top: 100,
  });
  canvas.value.add(img);
});

移出对象元素

const img: any = canvas.value.getObjects()[0];

if (img) {
    canvas.value.remove(img);
}

总结

以上是一些基本,操作;后续有时间学习会更新专栏。大家可以持续关注。

转载自:https://juejin.cn/post/7412505356741607458
评论
请登录