将Fabric js画布自定义上传背景图片,并支持另存为PC上的图像的处理方法

本文介绍如何使用 Fabric.js 实现图片上传功能,并通过浏览器 API 将上传的图片显示在 Canvas 上。此外,还提供了将 Canvas 中的内容保存为 PNG 图片的方法。此示例包含完整的 HTML 和 JavaScript 代码。

支持上传背景图片

在这里插入图片描述

关键代码


var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);

function handleImage(e) {

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

        // 将base64图片设置成背景
        canvas.setBackgroundImage(
            base64Img,
            canvas.renderAll.bind(canvas) // 刷新画布
        );
    }
    reader.readAsDataURL(e.target.files[0]);
}

保存到本地

关键代码

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';

}

所有代码

html

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">


    <title>Fabric.js 上传图片保存</title>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.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">
    <input type="file" id="imageLoader" name="imageLoader"/>
    <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)'
});
canvas.setWidth(300);
canvas.setHeight(300);



var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);

function handleImage(e) {
    var objects = canvas.getObjects();
    for (var i in objects) {
        objects[i].remove();
    }
    var reader = new FileReader();
    reader.onload = function (event) {
        var img = new Image();
        img.onload = function () {
            var imgInstance = new fabric.Image(img, {
                selectable: 1
            })
            canvas.add(imgInstance);
            canvas.deactivateAll().renderAll();
        }
        img.src = event.target.result;
    }
    reader.readAsDataURL(e.target.files[0]);
}



var imageSaver = document.getElementById('lnkDownload');
imageSaver.addEventListener('click', saveImage, false);

function saveImage(e) {
    this.href = canvas.toDataURL({
        format: 'png',
        quality: 0.8
    });
    this.download = 'canvas.png'
}

在这里插入图片描述
点击保存图片
在这里插入图片描述

Fabric.js 是一个强大的 JavaScript 库,用于创建和交互 SVG 及 canvas 图形。要实现在 Fabric.js 中监听鼠标滚轮事件,同时以鼠标点击点为中心让整个画布上的图片背景以及对象一起缩放,你可以按照以下步骤操作: 1. 首先,确保已包含 Fabric.js 的库,在 HTML 中添加一个 canvas 元素供用户交互: ```html <canvas id="myCanvas" width="800" height="600"></canvas> ``` 2. 加载 Fabric.js获取 canvas 实例: ```javascript const canvas = new fabric.Canvas('myCanvas', { selection: false }); ``` 3. 添加图片画布上,确保它是可缩放的对象: ```javascript const imgSource = 'your-image-source.jpg'; let imgObj = new fabric.Image(imgSource, { selectable: true, // 让对象可以被选中 }); imgObj.scaleX = imgObj.scaleY = 1; // 初始化缩放比例为 1 canvas.add(imgObj); ``` 4. 定义鼠标滚轮事件监听器,计算新的缩放因子应用到所有对象上: ```javascript canvas.on('mousewheel', function (e, delta) { const zoomFactor = Math.exp(delta / 10); // 正数放大,负数缩小 canvas.forEachObject((obj) => { obj.set({ scaleX: obj.getScaleX() * zoomFactor, scaleY: obj.getScaleY() * zoomFactor }); // 对象缩放 if (obj.isType('image')) { obj.setCenterFromPoint(e.target.getBoundingClientRect().left + e.clientX, e.target.getBoundingClientRect().top + e.clientY); // 设置图像中心点 } }); canvas.renderAll(); // 重新渲染画布 }); ``` 在这个例子中,当你滚动鼠标滚轮时,画布及其中的所有对象,包括图片背景,都会围绕鼠标点击点为中心缩放。注意,这里假设图片是通过 `fabric.Image` 类实例化的,如果不是,请相应地调整代码。 5.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值