Giter VIP home page Giter VIP logo

ikuaitu / vue-fabric-editor Goto Github PK

View Code? Open in Web Editor NEW
4.7K 46.0 870.0 178 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.47% HTML 0.27% Vue 51.77% CSS 0.69% Shell 0.03% TypeScript 38.17% Less 1.56% Dockerfile 0.05%
svg-editor fabricjs editor vue-fabric design design-editor poster canvas-editor image-editor

vue-fabric-editor's Introduction

English| 中文

开源图片编辑器

开源图片编辑器 · 插件化架构 · 拖拽式设计 · 功能完善

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

演示 · 文档 · 付费版演示 · 付费版介绍


stars stars contributors license 快图设计网站


演示

简介

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

动图介绍 · 介绍视频

特点

  1. 插件化架构:可通过插件的进行扩展开发,支持右键菜单和快捷键。
  2. 拖拽式设计:以轻量、简洁为主的图形编辑器,而非大而全的在线 PS 类的重行设计工具。
  3. 功能完善:PSD解析、辅助线、历史记录、渐变、自定义字体、裁剪等功能。

已有功能

  • 导入 JSON、PSD 文件
  • 导出 PNG、SVG、JSON 文件
  • 组合/拆分组合
  • 图层功能
  • 渐变属性
  • 外观属性/字体属性/描边/阴影
  • 撤销/重做
  • 快捷键
  • 右键菜单
  • 辅助线
  • 标尺
  • 自定义字体
  • 自定义模板素材
  • 插入 SVG、图片素材
  • 多元素水平、垂直对齐方式
  • 背景属性设置
  • 箭头/线条
  • 画笔/多边形绘制
  • 二维码/条形码
  • 图片替换/裁剪/滤镜
  • 水印
  • 国际化

使用

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

pnpm i
pnpm dev

开发者服务

  • 微信交流群:我们组建了多个微信项目交流群,作者和项目维护者活跃在群内,定期解答问题。
  • 知识星球:长期更新开源编辑器与fabric.js的相关资料,沉淀最佳实践、开发经验分享、代码示例等。
二维码

付费版本

帮助企业快速搭建在线设计工具,减少企业研发投入,避免重复造轮子。

功能介绍 · 产品介绍 · 演示

开源版本仅前端代码,付费版本提供完整的前后端、管理后台,功能完整开箱即用,提供源码授权、支持二次开发

  • 开箱即用,功能完整:设计能力丰富,提供完整前台、后台功能,部署即可使用。
  • 插件架构,扩展方便:基于插件化API,快速对编辑器进行二次开发。
  • 批量生成,快速出图:支持通过HTTP接口、表格文件批量生成图片。
  • 拖拽式设计,简单易用:适合普通用户操作,无需培训轻松上手。
  • 技术对接,文档培训:提供更多的支持,高效完成技术对接。
  • 定制开发,减少投入:支持快速完成功能定制开发,减少研发投入。
开源图片编辑器

贡献指南

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

如果你对这件事情感兴趣,真诚的邀请你加入,我们一起成长,你只要会简单的 Git 和 Javascript 语法就可以。

相关资料

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

  1. 使用 fabric.js 快速开发一个图片编辑器
  2. fabric.js 开发图片编辑器的细节实现
  3. fabric.js开发图片编辑器可以实现哪些功能?多图
  4. 我的开源项目与开源经历分享
  5. Canvas库 fabric.js可以实现哪些功能? 动图介绍
  6. Vue开源图片编辑器
  7. 个人开源项目商业化经验分享
  8. 开源fabric.js图片编辑器的插件化架构

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

致谢

管理员

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 georgesmith215 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 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  avatar  avatar  avatar

vue-fabric-editor's Issues

透明图片画布背景问题

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

组合定位问题

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

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?

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;
    }//设置四角旋转光标
})

画布大小保存

涉及到几个地方
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.