fabric.js介绍

fabric.js是可以简化canvas编写的js库,提供canvas缺少的对象模型,包含动画、数据序列和反序列化的等高级功能的js库,开源项目,在GitHub有很多人贡献。

官网:Fabric.js Javascript Canvas Library (fabricjs.com)

文档:JSDoc: Home (fabricjs.com)

示例:Demos — Fabric.js Javascript Canvas Library (fabricjs.com)

fabric.js笔记

对象

fabric.Circle 圆
fabric.Ellipse 椭圆
fabric.Line 直线
fabric.Polygon
fabric.Polyline
fabric.Rect 矩形
fabric.Triangle 三角形

方法

add(object) 添加
insertAt(object,index) 添加
remove(object) 移除
forEachObject 循环遍历
getObjects() 获取所有对象
item(int) 获取子项
isEmpty() 判断是否空画板
size() 画板元素个数
contains(object) 查询是否包含某个元素
fabric.util.cos
fabric.util.sin
fabric.util.drawDashedLine 绘制虚线
getWidth() setWidth()
getHeight()
clear() 清空
renderAll() 重绘
requestRenderAll() 请求重新渲染
rendercanvas() 重绘画板
getCenter().top/left 获取中心坐标
toDatalessJSON() 画板信息序列化成最小的json
toJSON() 画板信息序列化成json
moveTo(object,index) 移动
dispose() 释放
setCursor() 设置手势图标
getSelectionContext()获取选中的context
getSelectionElement()获取选中的元素
getActiveObject() 获取选中的对象
getActiveObjects() 获取选中的多个对象
discardActiveObject()取消当前选中对象
isType() 图片的类型
setColor(color) = canvas.set("full","");
rotate() 设置旋转角度
setCoords() 设置坐标

事件

object:added
object:removed
object:modified
object:rotating
object:scaling
object:moving
object:selected 这个方法v2已经废弃,使用selection:created替代,多选不会触发
before:selection:cleared
selection:cleared
selection:updated
selection:created
path:created
mouse:down
mouse:move
mouse:up
mouse:over
mouse:out
mouse:dblclick

常用属性

canvas.isDrawingMode = true; 可以自由绘制
canvas.selectable = false; 控件不能被选择,不会被操作
canvas.selection = true; 画板显示选中
canvas.skipTargetFind = true; 整个画板元素不能被选中
canvas.freeDrawingBrush.color = "#E34F51" 设置自由绘画笔的颜色
freeDrawingBrush.width 自由绘笔触宽度

IText的方法

selectAll() 选择全部
getSelectedText() 获取选中的文本
exitEditing() 退出编辑模式

 

图片去掉选中边框和旋转,且只能移动,不可操作

oImg.hasControls = false; 只能移动不能(编辑)操作
oImg.hasBorders = false; 去掉边框,可以正常操作
hasRotatingPoint = false; 不能被旋转
hasRotatingPoint 控制旋转点不可见

用法示例:

fabric.Image.fromURL("300.jpg", function (oImg) {

canvas.add(oImg);

oImg.hasControls = oImg.hasBorders = false;

});

动画

第一个参数是动画的属性,第二个参数是动画的最终位置,第三个参数是一个可选的对象,指定动画的细节:持续时间,回调,动效等。

第三个参数主要有

duration 默认为 500ms。可以用来改变动画的持续时间。

from 允许指定动画属性的起始值(如果我们不希望使用当前值)。

onComplete 动画结束之后的回调。

easing 动效函数。

绝对动画

用法示例:

let canvas = new fabric.Canvas("canvas");
let rect = new fabric.Rect({
    left400//距离左边的距离
    top200//距离上边的距离
    fill"green"//填充的颜色
    width200//宽度
    height200//高度
});
rect.animate("left"100, {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
});
canvas.add(rect);

相对动画(第二个参数通过+=,-=等来决定动画的最终效果)

rect.animate("left""+=100", {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
});

定义动画的动效函数

默认情况下,动画使用“easeInSine”动效执行。如果这不是你需要的,fabric 为我们提供了很多内置动画效果, fabric.util.ease 下有一大堆动效的选项。

常用的有easeOutBounce,easeInCubic,easeOutCubic,easeInElastic,easeOutElastic,easeInBounce 和 easeOutExpo等用法示例:

rect.animate("left"100, {
    onChange: canvas.renderAll.bind(canvas),
    duration1000,
    easing: fabric.util.ease.easeOutBounce,
});

图像滤镜

目前 Fabric 为我们提供了以下内置滤镜

BaseFilter 基本过滤器

Blur 模糊

Brightness 亮度

ColorMatrix 颜色矩阵

Contrast 对比

Convolute 卷积

Gamma 伽玛

Grayscale 灰度

HueRotation 色调旋转

Invert 倒置

Noise 噪音

Pixelate 像素化

RemoveColor 移除颜色

Resize 调整大小

Saturation 饱和

用法示例:

fabric.Image.fromURL(require("./aaa.jpeg"), (img) => {
    img.scale(0.5);
    // 添加滤镜
    img.filters.push(new fabric.Image.filters.Grayscale());
    // 图片加载完成之后,应用滤镜效果
    img.applyFilters();
    img.set({
        left300,
        top250,
    });
    canvas.add(img);
});

以原点为中心(左上角),缩放画布

      // 监听鼠标滚轮事件

      canvas.on('mouse:wheel', opt => {

        let delta = opt.e.deltaY // 滚轮向上滚一下是 -100,向下滚一下是 100

        let zoom = canvas.getZoom() // 获取画布当前缩放值

        // 控制缩放范围在 0.01~20 的区间内

        zoom *= 0.999 ** delta

        if (zoom > 20) zoom = 20

        if (zoom < 0.01) zoom = 0.01

        // 设置画布缩放比例

        canvas.setZoom(zoom)

      })

以鼠标指针为中心,缩放画布

  // 监听鼠标滚轮事件

  canvas.on('mouse:wheel', opt => {

    let delta = opt.e.deltaY // 滚轮向上滚一下是 -100,向下滚一下是 100

    let zoom = canvas.getZoom() // 获取画布当前缩放值

    // 控制缩放范围在 0.01~20 的区间内

    zoom *= 0.999 ** delta

    if (zoom > 20) zoom = 20

    if (zoom < 0.01) zoom = 0.01

    canvas.zoomToPoint(

      {

        x: opt.e.offsetX, // 鼠标x轴坐标

        y: opt.e.offsetY  // 鼠标y轴坐标

      },

      zoom // 最后要缩放的值

)

opt.e.preventDefault()

opt.e.stopPropagation()

  })

点击按钮控制缩放

// html     

<button @click="setZoom(0.1)">放大</button>

<button @click="setZoom(-0.1)">缩小</button>

// js

// 点击控制缩放

setZoom(val) {

    let zoom = this.canvas.getZoom() + parseFloat(val);

    zoom = Math.max(0.2, zoom);

    zoom = Math.min(5, zoom);

    let backPoint = this.canvas.getCenterPoint();

    console.log(backPoint);

    this.canvas.zoomToPoint(backPoint, zoom);

},

拖拽

canvas.selection = false;

      canvas.on('mouse:down', opt => { // 鼠标按下时触发

        let evt = opt.e

       

          canvas.isDragging = true // isDragging 是自定义的,开启移动状态

          canvas.lastPosX = evt.clientX // lastPosX 是自定义的

          canvas.lastPosY = evt.clientY // lastPosY 是自定义的

      })

      canvas.on('mouse:move', opt => { // 鼠标移动时触发

        console.log('查看e',opt);

        if (canvas.isDragging) {

          let evt = opt.e

          let vpt = canvas.viewportTransform // 聚焦视图的转换

          vpt[4] += evt.clientX - canvas.lastPosX

          vpt[5] += evt.clientY - canvas.lastPosY

          canvas.requestRenderAll() // 重新渲染

          canvas.lastPosX  = evt.clientX

          canvas.lastPosY  = evt.clientY

           canvas.requestRenderAll() // 重新渲染

        }

      })

      canvas.on('mouse:up', opt => { // 鼠标松开时触发

        canvas.setViewportTransform(canvas.viewportTransform) // 设置此画布实例的视口转换  

        canvas.isDragging = false // 关闭移动状态

      })

画布保存与恢复

var json = canvas.cloneJSON(); // 将画布状态序列化为 JSON 对象

console.log(json); // 可以将此 JSON 对象保存到服务器或进行其他操作

// 从 JSON 恢复画布状态

var newCanvas = new fabric.Canvas('newCanvas');

newCanvas.loadFromJSON(json); // 从 JSON 对象恢复画布状态

背景图

fabric.Image.fromURL('../../images/bg.jpg', img => {

  canvas.setBackgroundImage(img)

canvas.backgroundVpt=false;//背景图锁定,即不随画布缩放而改变

  canvas.renderAll()

})

设置完背景图再执行 canvas.renderAll() 才会重新渲染,不然画面看上去是没效果的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django报错--Not Found The requested URL was not found on the server.

这个问题通常是由于服务器配置或代码错误导致的。以下是解决这个问题的一些建议和步骤&#xff1a; 首先&#xff0c;请确保你的URL拼写正确。确认URL中的路径和文件名都是正确的&#xff0c;并且没有任何拼写错误。如果你是从浏览器中复制粘贴URL&#xff0c;请确保没有任何额…

CVE-2022-22965 Spring Framework远程命令执行

0x01 影响版本 Spring Framework < 5.3.18 Spring Framework < 5.2.20 JDK>9 0x02 复现环境 vulhub/spring/cve-2022-22965 0x03 漏洞复现 首先docker-compose up -d开启靶场 输入payload <%if("j".equals(request.getParameter("pwd")…

LSM树原理详解

LSM树(Log-Structured-Merge-Tree)的名字往往会给初识者一个错误的印象&#xff0c;事实上&#xff0c;LSM树并不像B树、红黑树一样是一颗严格的树状数据结构&#xff0c;它其实是一种存储结构&#xff0c;目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树。 LSM树的核…

C++八股文面经

1.介绍一下你对面向对象的理解&#xff0c; 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它将数据和操作数据的方法组合成一个对象&#xff0c;以此来描述现实世界中的事物和概念。在面向对象编程中&#…

如何在用pip配置文件设置HTTP爬虫IP

首先&#xff0c;定义问题&#xff1a;在 Pip 中设置HTTP爬虫IP服务器&#xff0c;以便在网络上进行访问和下载。 亲身经验&#xff1a;我曾经遇到过类似问题&#xff0c;通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证&#xff1a;根据 pip 官方文档&#xff…

小程序如何设置自取规则

​在小程序中&#xff0c;自取规则是指当客户下单时选择无需配送的情况下&#xff0c;如何设置相关的计费方式、指定时段费用、免费金额、预定时间和起取金额。下面将详细介绍如何设置这些规则&#xff0c;以便更好地满足客户的需求。 在小程序管理员后台->配送设置->自…

0基础学习PyFlink——用户自定义函数之UDTAF

大纲 UDTAFTableAggregateFunction的实现累加器定义创建累加 返回类型计算 完整代码 在前面几篇文章中&#xff0c;我们分别介绍了UDF、UDTF和UDAF这三种用户自定义函数。本节我们将介绍最后一种函数&#xff1a;UDTAF——用户自定义表值聚合函数。 UDTAF UDTAF函数即具备了…

什么是腾讯云轻量应用服务器?轻量性能和价格表分享

腾讯云轻量应用服务器怎么样&#xff1f;什么是腾讯云轻量应用服务器&#xff1f;轻量应用服务器性能怎么样&#xff1f;腾讯云轻量应用服务器如何收费&#xff1f;轻量2核2G3M云服务器88元一年、3年轻量2核2G4M带宽优惠价366.6元、轻量2核4G5M服务器166.6元一年、3年轻量2核4G…

【Javascript】ajax(阿甲克斯)

目录 什么是ajax? 同步与异步 原理 注意 写一个ajax请求 创建ajax对象 设置请求方式和地址 发送请求 设置响应HTTP请求状态变化的函数 什么是ajax? 是基于javascript的一种用于创建快速动态网页的技术&#xff0c;是一种在无需重新加载整个网页的情况下&#xff0c…

计算机网络【CN】IPV4报文格式

版本&#xff08;4bit&#xff09;&#xff1a;IPV4/IPV6首部长度&#xff08;4bit&#xff09;&#xff1a;标识首部的长度 单位是4B最小为&#xff1a;20B最大为&#xff1a;60&#xff08;15*4&#xff09;B总长度&#xff08;16bit&#xff09;&#xff1a;整个数据报&…

vue使用smooth-signature实现移动端电子签字,包括横竖屏

vue使用smooth-signature实现移动端电子签字&#xff0c;包括横竖屏 1.使用smooth-signature npm install --save smooth-signature二.页面引入插件 import SmoothSignature from "smooth-signature";三.实现效果 四.完整代码 <template><div class&quo…

LVS集群-DR模式

概念&#xff1a; LVS-DR模式&#xff0c;也是最常用的lVS负载方式&#xff0c;DR DIRECT ROUTING 直接路由模式 负载均衡器lVS调度器&#xff0c;只负责请求和转发到后端的真实服务器&#xff0c;但是影响结果&#xff0c;由后端服务器直接转发给客户端&#xff0c;不需要经…

2023年第四届MathorCup大数据竞赛(A题)|坑洼道路检测和识别|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 希望这些想法对大家的做题有一定的启发和借鉴意义。 让我们来…

LLM系列 | 22 : Code Llama实战(下篇):本地部署、量化及GPT-4对比

引言 模型简介 依赖安装 模型inference 代码补全 4-bit版模型 代码填充 指令编码 Code Llama vs ChatGPT vs GPT4 小结 引言 青山隐隐水迢迢&#xff0c;秋尽江南草未凋。 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖热干面的小女孩。紧接…

微信小程序设计之主体文件app-ts/js

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

iPhone开发--Xcode中的ld64和-ld_classic是什么意思

如下内容&#xff0c;翻译自官方论坛文档 文档地址如下&#xff1a; https://developer.apple.com/forums/thread/715385 关键内容摘抄如下&#xff1a; A static library is an archive of one or more object files. It has the extension .a. Use ar, libtool, and ranlib…

新的iLeakage攻击从Apple Safari窃取电子邮件和密码

图片 导语&#xff1a;学术研究人员开发出一种新的推测性侧信道攻击&#xff0c;名为iLeakage&#xff0c;可在所有最新的Apple设备上运行&#xff0c;并从Safari浏览器中提取敏感信息。 攻击概述 iLeakage是一种新型的推测性执行攻击&#xff0c;针对的是Apple Silicon CPU和…

Python中的文件操作和异常处理

在Python编程中&#xff0c;文件操作和异常处理是非常重要的概念。本文将介绍如何使用Python进行文件读写操作&#xff0c;并展示如何处理可能出现的错误和异常情况。 文件读写操作 Python提供了简单而强大的文件读写功能&#xff0c;让我们能够轻松地处理各种文件类型。下面…

【IT行业就业前景广阔:探讨热门方向与就业机会】

IT行业哪个方向比较好就业? IT行业是一个快速发展的领域&#xff0c;与许多其他行业紧密结合&#xff0c;为各个行业带来了巨大的变革和机遇。在这个充满活力的行业中&#xff0c;有许多就业方向可以选择。让我们一起来探讨一下IT行业的发展背景、就业方向以及分享一些就业经…

简单了解一下:NodeJS的WebSocket网络编程

NodeJS的webSocket网络编程。 那什么是WebSocket呢&#xff1f;WebSocket是HTML5提供的一种浏览器和服务器进行通信的网络技术。两者之间&#xff0c;只需要做一个握手动作&#xff0c;就可以在浏览器和服务器之间开启一条通道&#xff0c;就可以进行数据相互传输。 实现WebS…