Giter VIP home page Giter VIP logo

nihaojob / vue-fabric-editor Goto Github PK

View Code? Open in Web Editor NEW
4.6K 43.0 844.0 176.22 MB

快图设计-基于fabric.js和Vue的开源图片编辑器,可自定义字体、素材、设计模板。fabric.js and Vue based image editor, can customize fonts, materials, design templates.

Home Page: https://ikuaitu.github.io/doc/#/

License: MIT License

JavaScript 7.57% HTML 0.27% Vue 52.45% CSS 0.70% Shell 0.03% TypeScript 37.35% Less 1.58% Dockerfile 0.05%
svg-editor fabricjs editor vue-fabric design design-editor poster canvas-editor image-editor

vue-fabric-editor's Introduction

文档 | English | 中文

快图设计 - vue-fabric-editor

基于 fabric.js 和 Vue 开发的插件化图片编辑器,可自定义字体、素材、设计模板、右键菜单、快捷键。

image

特点

  1. 插件化架构:可自定义素材、右键菜单、快捷键等功能,易扩展。
  2. 简洁易用:以轻量、简洁为主的图形编辑器,而非大而全的在线 PS 类的重行设计工具。
  3. 功能齐全:自定义模板、渐变、自定义字体等功能,满足轻量图片编辑场景。

已有功能

功能介绍文章 文字 + 动图。

  • 导入 JSON、PSD 文件
  • 保存为 PNG、SVG、JSON 文件
  • 插入 SVG、图片文件
  • 多元素水平、垂直对齐方式
  • 字体模板
  • 组合/拆分组合
  • 图层及顺序调整
  • 撤销/重做
  • 背景属性设置
  • 外观属性/字体属性/描边/阴影
  • 自定义字体
  • 自定义模板素材
  • 快捷键
  • 右键菜单
  • 辅助线
  • 标尺
  • 图片替换
  • 图片滤镜
  • 国际化

使用

启动项目

请先安装 node.js v16,及 pnpm, 然后执行以下命令:

pnpm i
pnpm dev

自定义素材

可自定义字体、设计模板、标题模板,将接口、模板接口替换后即可。

开发者服务

  • 微信交流群:我们组建了多个微信项目交流群,作者和项目维护者活跃在群内,定期解答问题。
  • 知识星球:沉淀高质量常见问题、最佳实践文档,如跨域、部署、字体素材等问题,代码示例、长期更新围绕在开源编辑器、fabric.js 的相关资料。
  • 付费咨询:提供 200 元/小时的咨询服务,帮你快速解决项目中遇到的问题。

27d4480f-efa5-4ed3-93ed-d1a755cb41cf

付费版本

开源版本仅前端代码,付费版本提供完整的前后端服务,开箱即用,无须任何开发,支持 Docker 部署,包括功能:

  • 素材管理后台:可对编辑器中的字体、模板、图片素材进行便捷操作管理。
  • 批量导入:字体文件、素材、PSD 模板批量导入到后台系统。
  • 用户管理:支持登录/注册,用户账号禁用启用。
  • 用户素材:图片素材、用户模板。
  • HTTP 接口对接:微信、短信登录,API 接口登录,支持多种形式对接。
  • 批量图片生成:可根据模板 + 内容,批量生成创意图片。
  • 批量 AI 抠图:提供一定数量级的免费抠图服务。

我们致力于帮助企业快速、低成本构建图片编辑应用,支持定制开发,欢迎与我们联系。 image

贡献指南

项目致力于打造一个开箱即用的 web 图片编辑器应用,同时沉淀一个介于 web 图片编辑器应用与 fabric.js 之间的封装层,期望封装层面向开发者设计,提供更简单的接口,让开发者可以轻松的实现图片应用开发。

我们离目标还有很长的距离,如果你对这件事情感兴趣,真诚的邀请你加入,我们一起沉淀 fabric.js 的最佳实践,你会得到包括不限于以下列表的收获,你只要会简单的 Git 和 Javascript 语法就可以。

  • 熟悉开源协作方式,成为项目贡献者。
  • Vue3 + TS 实践,边学边开发。
  • fabric.js 开发,边学边开发。
  • 入门单元测试,边学边开发。
  • 众多的 fabric.js 开发者交流。
  • 图形编辑器架构经验。

目前有很多需要做的工作,比如英文文档的搭建、SDK 拆分等,欢迎与我联系,我愿意与你进行任何问题的交流,微信:13146890191。期待你的 issue 和 PR 。

这是我发表在掘金社区关于编辑器的技术笔记,会有更多的细节:

  1. 使用 fabric.js 快速开发一个图片编辑器
  2. fabric.js 开发图片编辑器的细节实现

注:如果遇到技术问题,期望使用 issue 讨论,它更加开放与透明,足够多的信息会让解决问题变得更高效,参考提问的智慧

规划

可能新增功能

第一阶段

  • 缩放
  • 三角形、箭头、线条
  • 复制 粘贴 快捷键
  • 拖动模式,放大缩小
  • 画布大小保存
  • 绘制线条
  • svgIcon 汇总
  • 标题样式列表模板
  • 预览

第二阶段

  • 图片替换
  • 渐变配置
  • 平铺背景、等比例背景
  • 图片裁剪
  • 滤镜
  • 描边 strokeDashArray

第三阶段

  • monorepo 升级 进行中
  • 插件化
  • 标尺插件
  • PSD 导入插件
  • 截图插件
  • 滤镜插件
  • 画布插件
  • 其他工具函数
  • @fabricEditor SDK 封装
  • 基于插件开发移动端
  • 基于插件开发其他图片应用
  • 文档建设(中英文)

致谢

管理员

nihaojob
nihaojob
Qiu-Jun
Qiu-Jun(求职,求内推)
wuchenguang1998
wuchenguang1998

贡献者

nihaojob
nihaojob
Qiu-Jun
Qiu-Jun
wuchenguang1998
wuchenguang1998
AliceLanniste
AliceLanniste
ylx252
ylx252
liumingye
liumingye
momo2019
momo2019
ByeWord
ByeWord
bigFace2019
bigFace2019
wohuweixiya
wohuweixiya
zjc2233
zjc2233
ijry
ijry
makeng
makeng
z09176141
z09176141
a847244052
a847244052
briver0825
briver0825
skyscraperno1
skyscraperno1
pengzhijian
pengzhijian
JiangShuQ
JiangShuQ
hudenghui
hudenghui
ddshiyu
ddshiyu
yehan68
yehan68
luke358
luke358
xiaozeo
xiaozeo
x007xyz
x007xyz
wozhi-cl
wozhi-cl
vvbear
vvbear
slarkerino
slarkerino
rolitter
rolitter
moJiXiang
moJiXiang
macheteHot
macheteHot
liuyaojun
liuyaojun
jooyyy
jooyyy
guda-art
guda-art
nanfb
nanfb
dulltackle
dulltackle
Bamzc
Bamzc
Yangzongtai
Yangzongtai
Alicehhhmm
Alicehhhmm
fuqianxi
fuqianxi
icleitoncosta
icleitoncosta
liucity
liucity

License

Licensed under the MIT License.

vue-fabric-editor's People

Contributors

a847244052 avatar alicelanniste avatar bigface2019 avatar briver0825 avatar byeword avatar ddshiyu avatar github-actions[bot] avatar hudenghui avatar ijry avatar jiangshuq avatar liumingye avatar luke358 avatar makeng avatar momo2019 avatar nihaojob avatar pengzhijian avatar qiu-jun avatar rolitter avatar skyscraperno1 avatar slarkerino avatar vvbear avatar wohuweixiya avatar wozhi-cl avatar wuchenguang1998 avatar x007xyz avatar xiaozeo avatar yehan68 avatar ylx252 avatar z09176141 avatar zjc2233 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-fabric-editor's Issues

撤销重做

大佬,为什么点击图层会记入一次撤销呢?能否优化一下 && 是否可以恢复删除的呢?

4个角支持旋转

/**
 * 
 * 实现 fabricjs 支持在四个边角按下旋转元素
 * @author 晗萧 <[email protected]>
 * @version 1.0.0
 * 
 */

//渲染自定义图标
function renderIcon(icon) {
    return function renderIcon(ctx, left, top, styleOverride, fabricObject) {
    var size = this.cornerSize;
    ctx.save();
    ctx.translate(left, top);
    // ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));//跟随元素旋转
    ctx.drawImage(icon, -size/2, -size/2, size, size);
    ctx.restore();
    }
}

//定义旋转光标样式,根据转动角度设定光标旋转
function rotateIcon(angle){
    return `url("data:image/svg+xml,%3Csvg height='18' width='18' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg' style='color: black;'%3E%3Cg fill='none' transform='rotate(`
    + angle
    +` 16 16)'%3E%3Cpath d='M22.4484 0L32 9.57891L22.4484 19.1478V13.1032C17.6121 13.8563 13.7935 17.6618 13.0479 22.4914H19.2141L9.60201 32.01L0 22.4813H6.54912C7.36524 14.1073 14.0453 7.44023 22.4484 6.61688V0Z' fill='white'/%3E%3Cpath d='M24.0605 3.89587L29.7229 9.57896L24.0605 15.252V11.3562C17.0479 11.4365 11.3753 17.0895 11.3048 24.0879H15.3048L9.60201 29.7308L3.90932 24.0879H8.0806C8.14106 15.3223 15.2645 8.22345 24.0605 8.14313V3.89587Z' fill='black'/%3E%3C/g%3E%3C/svg%3E ") 12 12,crosshair`
}
//添加旋转控制响应区域
fabric.Object.prototype.controls.mtr = new fabric.Control({
    x: -0.5,
    y: -0.5,
    offsetY: -10,
    offsetX: -10,
    rotate: 20,
    actionName: 'rotate',
    actionHandler: fabric.controlsUtils.rotationWithSnapping,
    render: ()=>{}
});//↖左上
fabric.Object.prototype.controls.mtr2 = new fabric.Control({
    x: 0.5,
    y: -0.5,
    offsetY: -10,
    offsetX: 10,
    rotate: 20,
    actionName: 'rotate',
    actionHandler: fabric.controlsUtils.rotationWithSnapping,
    render: ()=>{}
});//↗右上
fabric.Object.prototype.controls.mtr3 = new fabric.Control({
    x: 0.5,
    y: 0.5,
    offsetY: 10,
    offsetX: 10,
    rotate: 20,
    actionName: 'rotate',
    actionHandler: fabric.controlsUtils.rotationWithSnapping,
    render: ()=>{}
});//↘右下
fabric.Object.prototype.controls.mtr4 = new fabric.Control({
    x: -0.5,
    y: 0.5,
    offsetY: 10,
    offsetX: -10,
    rotate: 20,
    actionName: 'rotate',
    actionHandler: fabric.controlsUtils.rotationWithSnapping,
    render: ()=>{}
});//↙左下

//渲染时,执行
canvas2.on('after:render', function() {
    if(canvas2.getActiveObject()){
        fabric.Object.prototype.controls.mtr.cursorStyle = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2)))
        fabric.Object.prototype.controls.mtr2.cursorStyle = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+90)
        fabric.Object.prototype.controls.mtr3.cursorStyle = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+180)
        fabric.Object.prototype.controls.mtr4.cursorStyle = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+270)
    }
});

//旋转时,实时更新旋转控制图标
canvas2.on('object:rotating', function(event) {
    var body=document.getElementById('editor').nextSibling;
    switch (event.transform.corner) {
        case "mtr":
            body.style.cursor = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2)))
            break;
        case "mtr2":
            body.style.cursor = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+90)
            break;
        case "mtr3":
            body.style.cursor = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+180)
            break;
        case "mtr4":
            body.style.cursor = rotateIcon(Number(canvas2.getActiveObject().angle.toFixed(2))+270)
            break;
        default:
            break;
    }//设置四角旋转光标
})

Questions for migrations

Hello, I started the migration to Vue3, however, right away, I already had a problem.
The view-design library doesn't support vue3, only vue1 or vue2, do you have any suggestions of what we can use to replace it?

透明图片画布背景问题

使用矩形模拟画布 对于白色背景或透明图片的处理并不友好 应当像ps 背景层一样有棋盘格子 并附有拖拽效果
如果有此需求愿意贡献代码
dd

组合定位问题

请教一个问题,当两个元素(矩形+文字)组合的时候,整体的位置(x, y)是正值,而组合的元素(矩形和文字)的left、top都是负值,组合后的子元素都是根据什么定位的?

画布大小保存

涉及到几个地方
1、画布初始化,canvas无固定大小,根据视口100%展示。
2、画布初始化后,生成矩形元素模拟画布,固定ID标识
3、图层不展示模拟画布
4、背景属性的修改在模拟画布上生效
5、导出图片时只导出模拟画布内元素
6、导入/导出json时,测试是否正常

如何实现画布大小调整与缩放

我调研了下稿定设计和创客贴的效果,认为实现画布调整有几个重要的细节。

  1. 元素超出画布大小后仍然展示控制框。
  2. 画布超出视口时,会出现滚动条。
  3. 当拖动页面窗口改变大小时,画布区域可自适应展示全部内容。
  4. 无论缩放多大,画布与视口区域有明显分割。

Image

Image

Image

Image

我的实现思路:

  1. 使用矩形元素模拟画布区域,这样可实现超出画布后仍然可以看见控制条。
  2. fabric的canvas的宽高可根据缩放比例,超出外部DIV的宽高,这样可以实现放到后有滚动条效果。

名词定义:

  1. 视口: 外部的DIV元素,根据页面宽高和左右面板的开关状态 自动适应。
  2. canvas区域:即fabric的canvas的大小
  3. 画布区域:矩形元素,手动调整大小。

Image

我现在遇到的问题:

我缩放时画布后,矩形元素不在中心点,代码在 perf-workspace 分支上。

Image

https://github.com/nihaojob/vue-fabric-editor/blob/af08b554126605ac284316b4f6818f05c985bf64/src/components/setSize.vue#L70-L98

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.