canvas火焰动画、管线流动动画-Fabric.js

官网

http://fabricjs.com/ 一个canvas框架
项目地址

效果

在这里插入图片描述

代码

<template>
  <div class="home">
    <p>
      <label>Pattern left offset</label>
      <input type="range" min="0" max="500" value="0" id="img-offset-x">
    </p>
    <canvas id="canvas" width="1565" height="929"></canvas>
  </div>
</template>

<script setup>
import {onMounted} from "vue";

let canvas, rect, patternSourceCanvas, pattern;

fabric.Sprite = fabric.util.createClass(fabric.Image, {

  type: 'sprite',

  spriteWidth:  50,
  spriteHeight: 72,
  spriteIndex: 0,
  frameTime: 100,

  initialize: function(element, options) {
    options || (options = { });

    options.width = this.spriteWidth;
    options.height = this.spriteHeight;

    this.callSuper('initialize', element, options);

    this.createTmpCanvas();
    this.createSpriteImages();
  },

  createTmpCanvas: function() {
    this.tmpCanvasEl = fabric.util.createCanvasElement();
    this.tmpCanvasEl.width = this.spriteWidth || this.width;
    this.tmpCanvasEl.height = this.spriteHeight || this.height;
  },

  createSpriteImages: function() {
    this.spriteImages = [ ];

    var steps = this._element.width / this.spriteWidth;
    for (var i = 0; i < steps; i++) {
      this.createSpriteImage(i);
    }
  },

  createSpriteImage: function(i) {
    var tmpCtx = this.tmpCanvasEl.getContext('2d');
    tmpCtx.clearRect(0, 0, this.tmpCanvasEl.width, this.tmpCanvasEl.height);
    tmpCtx.drawImage(this._element, -i * this.spriteWidth, 0);

    var dataURL = this.tmpCanvasEl.toDataURL('image/png');
    var tmpImg = fabric.util.createImage();

    tmpImg.src = dataURL;

    this.spriteImages.push(tmpImg);
  },

  _render: function(ctx) {
    ctx.drawImage(
        this.spriteImages[this.spriteIndex],
        -this.width / 2,
        -this.height / 2
    );
  },

  play: function() {
    var _this = this;
    this.animInterval = setInterval(function() {

      _this.onPlay && _this.onPlay();
      _this.dirty = true;
      _this.spriteIndex++;
      if (_this.spriteIndex === _this.spriteImages.length) {
        _this.spriteIndex = 0;
      }
    }, this.frameTime);
  },

  stop: function() {
    clearInterval(this.animInterval);
  }
});

fabric.Sprite.fromURL = function(url, callback, imgOptions) {
  fabric.util.loadImage(url, function(img) {
    callback(new fabric.Sprite(img, imgOptions));
  });
};

fabric.Sprite.async = true;

function init() {
   canvas = new fabric.Canvas('canvas');
   rect = new fabric.Rect({
    top: 100,
    left: 100,
    width: 1565,
    height: 50, objectCaching: false,
  });
  canvas.add(rect);
  fabric.Image.fromURL('/img/road2.jpg', function(oImg) {
    patternSourceCanvas = new fabric.StaticCanvas();
    patternSourceCanvas.add(oImg);
    patternSourceCanvas.renderAll();
    pattern = new fabric.Pattern({
      source: patternSourceCanvas.getElement(),
      repeat: 'repeat',
    });
    rect.set('fill', pattern);
    canvas.requestRenderAll();
    document.getElementById('img-offset-x').oninput = function () {
      pattern.offsetX = parseInt(this.value, 10);
      console.log(pattern.offsetX)
      canvas.requestRenderAll();
    };
  })

  let createSprite = () => {
    return function(sprite) {
      sprite.set({
        left: 500,
        top: 500,
      });
      canvas.add(sprite);
      sprite.scale(4).setCoords();
      canvas.requestRenderAll();
      setTimeout(function() {
        sprite.set('dirty', true);
        sprite.play();
      }, fabric.util.getRandomInt(1, 10) * 100);
    };
  }

  fabric.Sprite.fromURL('/img/fire.png', createSprite(), {
    spriteWidth: 1200/15,
    spriteHeight: 85,
  });

}



function animal () {
  if (pattern && patternSourceCanvas)
  {
    pattern.offsetX = pattern.offsetX + 2;
    canvas.requestRenderAll();
  }
  requestAnimationFrame(animal)
}

onMounted(() => {
   init()
   animal()
})

</script>

<style lang="less">
.home {
  height: 100%;
}
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: openseadragon-fabricjs-overlay.js是一个用于在OpenSeadragon图像查看器中添加矩形、圆形、直线等标记的插件。它结合了OpenSeadragon和Fabric.js库的功能,为用户提供了绘制和编辑标记的能力。 通过openseadragon-fabricjs-overlay.js,我们可以在OpenSeadragon图像查看器上创建矩形、圆形和直线等形状作为标记。我们可以通过指定形状的位置、大小、颜色等属性来自定义标记的外观。同时,我们还可以添加标签或文字等额外信息,以便进一步描述标记。 这个插件不仅支持创建新的标记,还可以对已存在的标记进行编辑和删除。用户可以通过拖拽、缩放和旋转等交互方式对标记进行调整。这使得用户可以自由地在图像上添加、修改和删除标记,以满足不同的需求。 openseadragon-fabricjs-overlay.js是一个强大而灵活的插件,为用户提供了丰富的标记选择和操作功能。对于需要在OpenSeadragon图像查看器中进行标记的应用场景,它是一个非常有价值的工具。无论是学术研究、地理信息系统或其他需要对图像进行标注和分析的领域,openseadragon-fabricjs-overlay.js都可以方便地加入到现有项目中,提供更加丰富的交互和展示效果。 ### 回答2: openseadragon-fabricjs-overlay.js 是一个用于在 OpenSeadragon 图像查看器中进行标记的插件。它基于 Fabric.js 库,提供了在图像上绘制矩形、圆形和直线等标记的功能。 使用该插件,我们可以在图像上创建矩形、圆形和直线标记。首先,我们需要创建一个 Fabric.js canvas,将其添加到 OpenSeadragon 图像查看器中。然后,我们可以使用该插件提供的方法,例如 createRect、createCircle 和 createLine 来绘制标记。 例如,要创建一个矩形标记,我们可以使用 createRect 方法,并指定矩形的位置、大小和样式等参数。类似地,我们可以使用 createCircle 方法创建圆形标记,使用 createLine 方法创建直线标记。 绘制完成后,我们可以通过修改标记的属性来实现进一步的交互。例如,我们可以通过调整标记的位置、大小或颜色来修改标记的外观。我们还可以添加事件处理程序,使得标记可以响应用户的交互,例如点击或拖动。 总之,openseadragon-fabricjs-overlay.js 是一个方便的插件,它使我们可以在 OpenSeadragon 图像查看器中添加矩形、圆形、直线等标记。使用该插件,我们可以轻松地进行图像标注、注释或其他形式的交互,从而丰富用户的图像浏览体验。 ### 回答3: openseadragon-fabricjs-overlay.js是一个库,用于在OpenSeadragon中添加矩形、圆形、直线等标记。它基于fabric.js库,结合OpenSeadragon的功能,使得用户可以在OpenSeadragon图像上创建和编辑各种形状。 该库使用起来非常简便,只需要在OpenSeadragon实例中导入openseadragon-fabricjs-overlay.js,并设置所需的标记。例如,如果我们想要在OpenSeadragon图像中添加一个矩形,我们可以使用如下代码: ```javascript var viewer = OpenSeadragon({ // OpenSeadragon的配置选项 ... }); var overlay = viewer.fabricjsOverlay({ // openseadragon-fabricjs-overlay.js的配置选项 ... }); var rect = new fabric.Rect({ top: 100, left: 100, width: 200, height: 150, fill: 'red', opacity: 0.5 }); overlay.fabricCanvas().add(rect); ``` 通过以上代码,我们就在OpenSeadragon图像上成功添加了一个红色的半透明矩形。同样,我们也可以使用相似的方式添加圆形、直线等形状,只需调整相应的配置和参数即可。 openseadragon-fabricjs-overlay.js提供了丰富的功能,可以自定义标记的样式、位置和交互行为。我们还可以通过该库实现标记的编辑和移动等操作,使得用户可以根据需要在OpenSeadragon图像中添加各种标记,帮助用户更好地理解和分析图像内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值