用vue写的

显示,隐藏
hide(){
this.canvas.getActiveObject().set('opacity', 0).setCoords();
this.canvas.requestRenderAll()
},
display(){
this.canvas.getActiveObject().set('opacity', 1).setCoords();
this.canvas.requestRenderAll()
}, 翻转 水平 垂直用scaleY
flip(){
this.canvas.getActiveObject().set('scaleX', -1).setCoords();
this.canvas.requestRenderAll();
}, 克隆(复制粘贴) paste(_clipboard){
// clone again, so you can do multiple copies.
let canvas = this.canvas;
_clipboard.clone(function(clonedObj) {
canvas.discardActiveObject();
clonedObj.set({
left: clonedObj.left + 20,
top: clonedObj.top + 20,
evented: true,
});
if (clonedObj.type === 'activeSelection') {
// active selection needs a reference to the canvas.
clonedObj.canvas = canvas;
clonedObj.forEachObject(function(obj) {
canvas.add(obj);
});
// this should solve the unselectability
clonedObj.setCoords();
} else {
canvas.add(clonedObj);
}
_clipboard.top += 20;
_clipboard.left += 20;
canvas.setActiveObject(clonedObj);
// canvas.requestRenderAll();
});
},
copy(){
let canvas = this.canvas;
var _self = this;
canvas.getActiveObject().clone(function(cloned){
// let _clipboard = cloned;
_self.paste(cloned); })
}, 历史记录,回退撤销 data 初始化
config : {
canvasState : [],
currentStateIndex : -1,
redoStatus : false, //撤销状态
undoStatus : false, // 重做状态
undoFinishedStatus : 1,
redoFinishedStatus : 1,
undoButton : this.$refs.undo, //得不到 在 mounted 得到
redoButton : this.$refs.redo,
} 记录事件
canvasDataChange(){
let _self = this;
this.canvas.on('object:modified', function(){
_self.updateCanvasState();
});
this.canvas.on('object:added', function(){
_self.updateCanvasState()
});
this.canvas.on('object:removed', function(){
_self.updateCanvasState()
});
this.canvas.on('object:rotating', function(){
_self.updateCanvasState()
});
}, undo() {
let _self =this;
if(this.config.undoFinishedStatus){
if(this.config.currentStateIndex == -1){
this.config.undoStatus = false;
}
else{
if (this.config.canvasState.length >= 1) {
this.config.undoFinishedStatus = 0;
if(this.config.currentStateIndex != 0){
this.config.undoStatus = true;
this.canvas.loadFromJSON(this.config.canvasState[this.config.currentStateIndex-1],function(){
var jsonData = JSON.parse(_self.config.canvasState[_self.config.currentStateIndex-1]);
_self.canvas.renderAll();
_self.config.undoStatus = false;
_self.config.currentStateIndex -= 1;
// _self.config.undoButton.removeAttribute("disabled");
// _self.config.undoButton.disabled = false;
if(_self.config.currentStateIndex !== _self.config.canvasState.length-1){
// _self.config.redoButton.removeAttribute('disabled');
// _self.config.redoButton.disabled = false;
}
_self.config.undoFinishedStatus = 1;
});
}
else if(_self.config.currentStateIndex == 0){
_self.canvas.clear();
_self.config.undoFinishedStatus = 1;
// _self.config.undoButton.disabled= "disabled";
// _self.config.redoButton.removeAttribute('disabled');
// _self.config.redoButton.disabled = false;
_self.config.currentStateIndex -= 1;
}
}
}
}
},
redo() {
let _self = this;
if(this.config.redoFinishedStatus){
if((this.config.currentStateIndex == this.config.canvasState.length-1) && this.config.currentStateIndex != -1){
// this.config.redoButton.disabled= true;
}else{
if(this.config.canvasState.length > this.config.currentStateIndex && this.config.canvasState.length != 0){
this.config.redoFinishedStatus = 0;
this.config.redoStatus = true;
this.canvas.loadFromJSON(this.config.canvasState[this.config.currentStateIndex+1],function(){
var jsonData = JSON.parse(_self.config.canvasState[_self.config.currentStateIndex+1]);
_self.canvas.renderAll();
_self.config.redoStatus = false;
_self.config.currentStateIndex += 1;
if(_self.config.currentStateIndex != -1){
// _self.config.redoButton.disabled = false;
}
_self.config.redoFinishedStatus = 1;
if((_self.config.currentStateIndex == _self.config.canvasState.length-1) && _self.config.currentStateIndex != -1){
// _self.config.redoButton.disabled= true;
}
});
}
}
}
}, 删除
del() {
var el = this.canvas.getActiveObject();
this.canvas.remove(el);
}, 格式化 数据
toJson(){ console.log(JSON.stringify(this.canvas.toJSON()));
},
toSVG(){
// return this.canvas.toSVG()
console.log(this.canvas.toSVG());
}, canvas导出为图片并下载 canvasToImage(){
var MIME_TYPE = "image/png";
//转换成base64
var imgURL = this.canvas.toDataURL(MIME_TYPE);
  //创建一个a链接,模拟点击下载
  var dlLink = document.createElement('a');
var filename = '个人画板_' + (new Date()).getTime() + '.png';
  dlLink.download = filename;
  dlLink.href = imgURL;
  dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
  document.body.appendChild(dlLink);
  dlLink.click();
  document.body.removeChild(dlLink);
}, 或者
downloadimage(event){
// 图片导出为 png 格式
var type = 'png';
// 返回一个包含JPG图片的<img>元素
var img_png_src = this.canvas.toDataURL("image/png"); //将画板保存为图片格式的函数
var imgData = img_png_src.replace(this._fixType(type),'image/octet-stream'); var filename = '个人画板_' + (new Date()).getTime() + '.' + type; this.saveFile(imgData,filename);
}, saveFile(data, filename){
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
save_link.href = data;
save_link.download = filename;
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event);
}, _fixType(type) {
type = type.toLowerCase().replace(/jpg/i, 'jpeg');
var r = type.match(/png|jpeg|bmp|gif/)[0];
return 'image/' + r;
}, 组合 打散
group() {
this.fabricAction.fabricObjGroup(this);
},
ungroup() {
this.fabricAction.fabricObjUnGroup(this);
}, 锁定
lock() {
this.fabricAction.lockOption(this);
},

  

fabric.js 翻转,复制粘贴,隐藏, 删除,历史记录,撤销, 剪切, 图层,组合打散,锁定等功能的更多相关文章

  1. js实现复制粘贴功能

    在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能. 另一篇是禁止复制粘贴 前端er怎样操作剪切复制以及禁止复制+破解等 初步想法: 1. ...

  2. js 实现复制粘贴

    js 实现复制粘贴 <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" ...

  3. 通过如何通过js实现复制粘贴功能

    在ie中window.clipboardData(剪切板对象)是可以被获取,所以利用这个方法我们可以实现在IE当中复制粘贴的功能,demo如下! <html> <head> & ...

  4. vi--文本编辑常用快捷键之复制-粘贴-替换-删除

    这几天刚开始接触vi编辑器,慢慢开始熟悉vi,但是还是感觉诸多不便,比如说复制粘贴删除操作不能用鼠标总是感觉不自在,而且我一般习惯用方向键移动光标,更增加了操作的复杂度,今天在网上搜索了一下,vim编 ...

  5. js 实现复制粘贴文本过滤(保留文字和图片)

    实现复制粘贴文本过滤(保留文字和图片) demo如下: <head> <meta http-equiv="Content-Type" content=" ...

  6. JS ----实现复制粘贴功能 (剪切板应用clipboardData)

    注意:ie7,与ie8 对网页有个复制的权限,需在“安全”中的“自定义级别”的脚本中设置 clipboardData 对象 提供了对剪贴板的访问. 三个方法 :1.clearData(sDataFor ...

  7. 在html页面通过js实现复制粘贴功能

    前言:要实现这个功能,常用的方式大概分为两类,第一种就是上插件,这个网上有大把,第二种就是直接用几行JS来实现. 这次说第二种实现方式,这方式有很大的局限性,只能用表单元素,并且不能设置disable ...

  8. js实现复制粘贴

    项目中经常会遇到点击按钮复制订单号.订单id等内容到粘贴板中的需求.可是通常我们都是用Ctrl + c或右击复制的,别操心,js也是有复制命令的,那就是document.execCommand('co ...

  9. vim 学习日志(1):剪切,复制,粘贴,删除,撤销

    一:光标命令     左h 上j 下k 右l :goto n 表示跳转到文本的第n个字符 :n 表示跳到第n行 nG n为行数,该命令立即使光标跳到指定行:n为空,光标跳到文件最后一行. Ctrl+G ...

随机推荐

  1. Full-featured Vue 评分组件

    分享一下最近写的 vue 的评分组件 Features: 支持半星.可清除.文案展示.只读.自定义颜色.自定义字符及图片等.支持 hover 的时候改变 value.内置三种样式,以及非常好看 DEM ...

  2. Git 基础教程 之 创建版本库

    一,选择一个合适的地方,创建空目录,下面两种方法都可 ①   手动新建 ②   使用命令: mkdir pythonwork 二,初始化,使目录变成Git可管理的仓库        执行: git i ...

  3. SPOJ 1771&&DLX精确覆盖,重复覆盖

    DLX的题,做过这题才算是会吧. 这道题转化成了精确覆盖模型来做,一开始,只是单纯的要覆盖完行列和斜线,WA. 后来醒悟了,不能这样,只要覆盖全部行或列即可.虽然如此,但某些细节地方很关键不能考虑到. ...

  4. 程序中的文件之沙盒以及plist文件的初步使用

    沙盒是相对于"应用程序"的文件,也就是相相应app所在的页面的文件. 每个应用都有自己的应用沙盒(应用沙盒就是文件系统文件夹).与其它文件系统隔离.应用必须呆在在积极的沙盒中.其它 ...

  5. WinForm使用CefSharp内嵌chrome浏览器

    先贴运行图:亲测可用!以图为证! 开始!1.创建winform程序,使用.NET 4.5.2或以上(vs2010最高支持.NET 4.0,我使用的是vs2017).这一步容易忽略,简单的说就是将项目. ...

  6. spring中abstract bean的使用方法

    什么是abstract bean?简单来说.就是在java中的继承时候,所要用到的父类. 案例文件结构: 当中Person类为父类.Student类为子类,其详细类为: package com.tes ...

  7. Windows 7下Git SSH 创建Key【待解决?】

    1.在桌面右键,git bash here 2.检查本机是否有ssh key设置 $ cd ~/.ssh 或cd .ssh 如果没有则提示: No such file or directory:此时需 ...

  8. C#调用C++回调函数的问题

    C++的回调函数中有一个参数是,是返回一个字符串,原则如下: typedef   void   (*TDataEvent)(char   *AData   ,int   ALen); 其中char   ...

  9. 国内物联网平台初探(八):中移物联网开放平台OneNet

    平台定位 OneNET是中移物联网有限公司搭建的开放.共赢设备云平台,为各种跨平台物联网应用.行业解决方案,提供简便的云端接入.存储.计算和展现,快速打造物联网产品应用,降低开发成本. IoT Paa ...

  10. 【转】IOS中Json解析的四种方法

    原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有 ...