从零开始学 Fabric.js-01 (画一个矩形,矩形内填充图片)。

从零开始学 Fabric.js-01 (画一个矩形,矩形内填充图片)。

前言

2024 年我几乎没怎么碰过 Fabric.js,工作中遇到问题都是临时抱佛脚------翻文档、搜答案、解决问题。这样学下来,知识点零散得像一盘散沙,没个系统。所以,我决定从头开始,跟着官方文档,结合小案例,重新梳理 Fabric.js,把基础打牢。这次,我假装自己是小白,从零起步,和你一起探索这个有趣的 Canvas 库!

今日小案例:矩形填充图片

目标很简单:画一个矩形,把图片填充进去,但不创建新的 Fabric 对象。换句话说,就是让矩形直接用图片作为填充效果,而不是叠加一个独立的图片对象。

第一步:画一个矩形

先搭个基本框架,创建一个 Canvas 和矩形试试水。

html 复制代码
<canvas id="canvas" width="300" height="300"></canvas>

<script src="https://cdn.jsdelivr.net/npm/fabric@6.4.3/dist/index.js"></script>
<script>
  const canvas = new fabric.Canvas('canvas');
  const rect = new fabric.Rect({
    width: 100,  // 宽度
    height: 100, // 高度
    left: 100,   // 距左边距离
    top: 100,    // 距顶部距离
    fill: 'red'  // 填充红色
  });
  canvas.add(rect); // 别忘了加到画布上
</script>

运行后,Canvas 上出现一个红色矩形,位置居中,简单明了。但目标是用图片填充,红色只是占位,咱们继续。

第二步:尝试填充图片

直觉告诉我,把 fill: 'red' 改成图片 URL(比如 'https://example.com/image.jpg')应该行得通。结果一跑,报错!翻了下文档才发现,fabric.Rect 的 fill 属性不支持直接填图片地址,得用特殊方法。

第三步:发现 fabric.Pattern

查阅 Fabric.js 官方文档(fabricjs.com/docs),`fill... 可以接受 fabric.Pattern 对象,而 fabric.Pattern 是专门用来处理图案填充的。它需要一个"源"(source),可以是图片或另一个 Canvas。思路清晰了:先把图片画到一个临时 Canvas 上,再用 fabric.Pattern 把这个 Canvas 填充到矩形。

fabric.Pattern 用法
javascript 复制代码
const pattern = new fabric.Pattern({
  source: canvas1, // 一个画了图片的 Canvas
  repeat: 'no-repeat' // 不重复填充
});

第四步:完整实现

把图片加载到临时 Canvas,再填充到矩形,代码如下:

html 复制代码
<canvas id="canvas" width="300" height="300"></canvas>

<script src="https://cdn.jsdelivr.net/npm/fabric@6.4.3/dist/index.js"></script>
<script>
  // 封装加载图片的 Promise
  function loadImage(url) {
    return new Promise((resolve) => {
      const img = new Image();
      img.src = url;
      img.onload = () => resolve(img);
    });
  }

  const canvas = new fabric.Canvas('canvas');
  const imgUrl = 'https://p3-passport.byteacctimg.com/img/user-avatar/3a7164e8729a54bf8a5e51a7c2bb6157~300x300.image';

  loadImage(imgUrl).then(img => {
    // 创建临时 Canvas
    const canvas1 = document.createElement('canvas');
    canvas1.width = 100;  // 匹配矩形尺寸
    canvas1.height = 100;
    const ctx = canvas1.getContext('2d');
    ctx.drawImage(img, 0, 0, 100, 100); // 画图并缩放到 100x100

    // 创建图案
    const pattern = new fabric.Pattern({
      source: canvas1,
      repeat: 'no-repeat'
    });

    // 定义矩形并填充图案
    const rect = new fabric.Rect({
      width: 100,
      height: 100,
      left: 100,
      top: 100,
      fill: pattern
    });

    canvas.add(rect); // 添加到画布
  });
</script>
在线 Demo

代码解析

  1. 加载图片 :用 loadImage 函数异步加载图片,确保图片 ready 后再操作。
  2. 临时 Canvas :创建 canvas1,用原生 2D 上下文把图片画上去,尺寸与矩形一致。
  3. 图案填充 :fabric.Pattern 把 canvas1 转为填充图案,repeat: 'no-repeat' 保证不平铺。
  4. 矩形渲染 :把 pattern 赋值给 fill,矩形就有了图片效果。

小结与反思

  • 收获 :学会了 fabric.Pattern 的用法,理解了 Fabric.js 的填充机制。
  • 坑点:直接填图片 URL 不行,得转成 Canvas 或图案对象。
相关推荐
程序员海军27 分钟前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee1 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel2 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰3 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境3 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉4 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
濮水大叔4 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程
zimoyin4 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
风骏时光牛马5 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing035 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数