学习整理fabric.js实现上传图片并替换已有图片元素、更换背景图片的方法

17 篇文章 6 订阅

学习整理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,// 指示toObject/toDatalessObject是否应该包含默认值,如果设置为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);//缩小0.4倍

    // 给矩形添加一个选中事件
    img.on('selected', options => {
        console.log('选中图片啦', options);

        //添加画布点击事件
        addClickEvent();

    });


    canvas.add(img);
}, {
    left: 100,
    top: 200,
});


// 使用 IText,可编辑文本
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);

// 获取图片对象 canvas.getActiveObject()
    let img = canvas.getActiveObject();
    if (!img) {
        alert('请选择要替换的图片');
        return false;
    }

    let reader = new FileReader();
    reader.onload = function (event) {
        // 转换成base64格式
        var base64Img = reader.result;

        console.log('canvas.width==', canvas.width);
        console.log('canvas.height==', canvas.height);

        //将当前选中的图片替换


        // 使用 setSrc 方法更改图片,第二个参数是回调函数,在回调函数里刷新一下 canvas 即可
        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) {
        // 转换成base64格式
        var base64Img = reader.result;

        console.log('canvas.width==', canvas.width);
        console.log('canvas.height==', canvas.height);


        // 将base64图片设置成背景
        canvas.setBackgroundImage(
            base64Img,
            canvas.renderAll.bind(canvas), // 刷新画布 //保证背景图1:1铺满容器
            {
                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';

}
fabric.js是一个强大的JavaScript库,用于创建基于HTML5 canvas的应用程序,包括图像编辑、绘画和拼贴功能。在fabric.js中,你可以很容易地实现图片裁剪功能,通常通过以下几个步骤: 1. **引入fabric.js库**:首先,在HTML文件中引入fabric.js库和CSS样式。 ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.0.4/fabric.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/5.0.4/fabric.css"> ``` 2. **初始化canvas**:创建一个canvas元素,并使用fabric对象将其转换为可交互的画布。 ```javascript var canvas = new fabric.Canvas('myCanvas', { backgroundColor: 'white', }); ``` 3. **加载图片**:你可以通过`fabric.Image.fromURL`方法加载图片到画布上。 ```javascript fabric.Image.fromURL('image.jpg', function(img) { img.set({ left: 50, top: 50 }); // 设置图片位置 canvas.add(img); // 将图片添加到画布上 }); ``` 4. **启用裁剪功能**:fabric.jsImage对象有一个名为`interactivelyResize`的属性,可以设置它为true,允许用户拖拽四角或边框来裁剪图片。 ```javascript img.interactivelyResize = true; ``` 5. **监听缩放和裁剪事件**:当用户开始裁剪时,可以监听`object:scalingStarted`和`object:scalingFinished`等事件,根据需要调整裁剪区域。 6. **获取裁剪后的图片数据**:一旦裁剪完成,你可以从`canvas.getObjects()`中找到裁剪的图片,然后根据需求保存或处理它们。 ```javascript canvas.on('object:modified', function(e) { var croppedImage = canvas.toDataURL(); // 获得裁剪后图片URL console.log(croppedImage); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值