学习整理fabric.js实现上传图片并替换已有图片元素、更换背景图片的方法
原图
效果图
实现代码
index.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Fabric.js 上传图片并替换已有图片元素、更换背景图片</title>
<script src="../fabric5.2.1.js"></script>
<script src="../jquery-2.1.4.min.js"></script>
<style>
div#container {
padding: 30px;
font-family: 'verdana', lucida;
}
a {
color: #777;
display: block;
background-color: #ccc;
width: 300px;
padding: 0;
margin-top: 2px;
text-decoration: none;
}
</style>
</head>
<body>
<div id="container">
<input id="change_img" style="display:none" class="aload" type='button' value='换图' onClick="upImg('hiddenFile')"/>
<input id='hiddenFile' type='file' style="display:none"/>
<input class="aload" type='button' value='换背景' onClick="upImg('imageLoader')"/>
<input type="file" id="imageLoader" name="imageLoader" style="display:none"/>
<canvas id="imageCanvas" width="300" height="300"></canvas>
<a id="lnkDownload" href="#">Save image</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(500);
canvas.setHeight(500);
var rect = new fabric.Rect({
left: 100,
top: 100,
fill: 'orange',
width: 100,
height: 100
});
rect.on('selected', options => {
console.log('选中矩形啦');
addClickEvent();
});
canvas.add(rect);
var rect2 = new fabric.Rect({
left: 300,
top: 100,
fill: 'yellowgreen',
width: 100,
height: 100,
rx: 20,
ry: 20
});
canvas.add(rect2);
fabric.Image.fromURL('../img/qipa250.jpeg', function (img) {
img.scale(0.2);
img.on('selected', options => {
console.log('选中图片啦', options);
addClickEvent();
});
canvas.add(img);
}, {
left: 100,
top: 200,
});
var text = new fabric.IText(
'奇葩呀,www.qipa250.com',
{
fontFamily: 'Comic Sans'
}
)
canvas.add(text);
function upImg(file_id) {
$("#" + file_id).click();
}
var hiddenFile = document.getElementById('hiddenFile');
hiddenFile.addEventListener('change', handleImage, false);
var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleBgImage, false);
function handleImage(e) {
console.log('handleImage.e==', e);
let img = canvas.getActiveObject();
if (!img) {
alert('请选择要替换的图片');
return false;
}
let reader = new FileReader();
reader.onload = function (event) {
var base64Img = reader.result;
console.log('canvas.width==', canvas.width);
console.log('canvas.height==', canvas.height);
img.setSrc(base64Img, () => {
canvas.renderAll();
});
}
reader.readAsDataURL(e.target.files[0]);
}
function handleBgImage(e) {
console.log('handleImage.e==', e);
let reader = new FileReader();
reader.onload = function (event) {
var base64Img = reader.result;
console.log('canvas.width==', canvas.width);
console.log('canvas.height==', canvas.height);
canvas.setBackgroundImage(
base64Img,
canvas.renderAll.bind(canvas),
{
scaleX: 1,
scaleY: 1,
});
}
reader.readAsDataURL(e.target.files[0]);
}
function removeClickEvent() {
canvas.off('mouse:down');
}
function addClickEvent() {
let ob_type = canvas.getActiveObject().get('type');
alert('ob_type===' + ob_type);
removeClickEvent();
if (ob_type != 'image') {
$("#change_img").attr('style', 'display:none');
} else {
$("#change_img").attr('style', 'display:block');
}
}
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';
}