原图

代码
index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Fabric.js 文字、图片翻转、克隆、显示、隐藏功能</title>
<script src="../fabric5.2.1.js"></script>
<style>
div#container {
padding: 30px;
font-family: 'verdana', lucida;
}
input {
background-color: #ccc;
padding: 0;
width: 300px;
color: #777;
}
a {
color: #777;
display: block;
background-color: #ccc;
width: 300px;
padding: 0;
margin-top: 2px;
text-decoration: none;
}
</style>
</head>
<body>
<div id="container">
<p>
<button onclick="clonecopy()">克隆</button>
</p>
<p>
<button onclick="hide()">隐藏</button>
</p>
<p>
<button onclick="display()">显示</button>
</p>
<p>
<button onclick="flip()">翻转</button>
</p>
<canvas id="imageCanvas" width="300" height="300"></canvas>
<a id="lnkDownload" href="#">点我保存图片</a>
</div>
<script src="script.js"></script>
</body>
</html>
script.js
var canvas = new fabric.Canvas('imageCanvas', {
backgroundColor: 'rgb(240,240,240)',
includeDefaultValues: false,
perPixelTargetFind: true,
hasBorders: false,
});
canvas.setWidth(800);
canvas.setHeight(900);
fabric.Image.fromURL('../img/qipa250.jpeg', function (img) {
img.scale(0.2);
canvas.add(img);
}, {
left: 100,
});
fabric.Image.fromURL('../img/qipa250.jpeg', function (img) {
img.scale(0.2).set('flipX', true);
canvas.add(img);
}, {
left: 100,
top: 330,
});
var text_1 = new fabric.IText(
'《天净沙·秋思》\n枯藤老树昏鸦,\n小桥流水人家,\n古道西风瘦马。\n夕阳西下,\n断肠人在天涯。',
{
width: 300,
fontSize: 14,
fontFamily: 'Comic Sans',
left: 100,
top: 200,
fill: 'blue',
splitByGrapheme: true,
}
);
canvas.add(text_1);
function hide() {
canvas.getActiveObject().set('opacity', 0).setCoords();
canvas.renderAll();
}
function display() {
canvas.getActiveObject().set('opacity', 1).setCoords();
canvas.renderAll();
}
function flip() {
canvas.getActiveObject().set('scaleX', -1).setCoords();
canvas.renderAll();
}
function paste(_clipboard) {
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') {
clonedObj.canvas = canvas;
clonedObj.forEachObject(function (obj) {
canvas.add(obj);
});
clonedObj.setCoords();
} else {
canvas.add(clonedObj);
}
_clipboard.top += 20;
_clipboard.left += 20;
canvas.setActiveObject(clonedObj);
});
}
function clonecopy() {
let canvas = this.canvas;
var _self = this;
canvas.getActiveObject().clone(function (cloned) {
paste(cloned);
});
canvas.renderAll();
}
function showkey() {
key = event.keyCode;
switch (key) {
case 37://"按了←键!"
alert("按了←键!");
break;
case 38://"按了↑键!"
alert("按了↑键!");
break;
case 39://"按了→键!"
alert("按了→键!");
break;
case 40://"按了↓键!"
alert("按了↓键!");
break;
case 46://"按了delete键!"
alert("按了delete键!");
canvas.remove(canvas.getActiveObject());
break;
}
}
document.onkeydown = showkey;
var imageSaver = document.getElementById('lnkDownload');
imageSaver.addEventListener('click', saveImage, false);
function saveImage(e) {
console.log('toJSON==', canvas.toJSON());
console.log('toObject==', canvas.toObject());
this.href = canvas.toDataURL({
format: 'png',
quality: 0.8
});
this.download = 'canvas.png';
}
效果图
