canvas+fabric实现自定义封面

这篇具有很好参考价值的文章主要介绍了canvas+fabric实现自定义封面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

canvas+fabric实现自定义封面,fabric,javascript,前端,vue.js文章来源地址https://www.toymoban.com/news/detail-810038.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            margin: 0 auto;
        }
    </style>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script>
</head>

<body>
    <div>
        <button class="btn">点击</button>
        <button class="add-text">添加文案</button>
        <button class="to-base64">生成图片</button>
        <canvas id="canvas" width="500" style="border:1px solid black"></canvas>
    </div>
    <script>
        const btn = document.querySelector('.btn')
        const addText = document.querySelector('.add-text')
        const base64Image = document.querySelector('.to-base64')
        var canvas = document.getElementById("canvas")
        var ctx = canvas.getContext('2d');
        var left = 0

        // 实例化
        let fabricObj = new fabric.Canvas('canvas')
        //  设置画布宽高  可以动态设置画布宽高,如果在标签上也设置了宽高,则会将其覆盖掉
        fabricObj.setWidth(500)
        fabricObj.setHeight(500)
        // 设置背景图
        function setBackImage() {
            function setPictureBg(src) {
                const newImg = new Image();
                newImg.src = src;
                newImg.onload = () => {
                    fabricObj.setBackgroundImage(src, fabricObj.renderAll.bind(fabricObj), {
                        scaleX: fabricObj.width / newImg.width,
                        scaleY: fabricObj.height / newImg.height,
                        crossOrigin: 'anonymous'
                    });
                };
            }
            setPictureBg('https://sput.xwabx.com/file/background/1/image_02.png')

            let num = -1
            const urls = [
                'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
                'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
                'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
                'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
                'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
                'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
                'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
            ]
            btn.onclick = () => {
                if (num == 6) {
                    num = -1
                }
                num++
                setPictureBg(urls[num])
            }
        }
        setBackImage()


        var count = 1
        var arr = [`text${count}`]
        function setTextBorder() {
            function setTextStyle(cur) {
                // 创建文本对象并设置相关属性
                cur = new fabric.Textbox(
                    '阿里士大夫艰苦', {
                    lineHeight: 1.2,
                    left: 5,
                    top: 40,
                    fontSize: 40,
                    fontFamily: 'HanKangLiJinhei',
                    fill: '#000',
                    stroke: 'blue', // 设置描边颜色为黑色
                    strokeWidth: 1, // 设置描边宽度为3像素
                    textAlign: 'center',
                    editable: false, // 不能编辑
                    hasControls: false, //没有控制角,只能移动操作
                    splitByGrapheme: true, //文字自动换行
                    lockScalingY: true, // 禁止Y轴伸缩
                    // lockMovementX: true //禁止横向移动

                }
                );
                // 将文本添加到画布上
                fabricObj.add(cur);
                cur.on('moving', function () {
                    movingFn(cur)
                });
            }
            setTextStyle(arr[0])

            // 添加文案
            addText.onclick = () => {
                count++
                arr.push(`text${count}`)
                setTextStyle(arr[count - 1])
            }
        }
        setTextBorder()


        // 移动操作限制
        function movingFn(currentText) {
            const { width: cWidth, height: cHeight } = canvas.style;
            const { width: fWidth, height: fHeight, left, top } = currentText;

            let isOutSide = false;
            //超出左边界
            if (left < 0) {
                currentText.left = 10;
                isOutSide = true;
            }
            // 超出右边界
            if (left + fWidth >= Number(cWidth.slice(0, -2))) {
                currentText.left = Number(cWidth.slice(0, -2)) - fWidth - 10;
                isOutSide = true;
            }
            // 超出上边界
            if (top <= 0) {
                currentText.top = 0;
                isOutSide = true;
            }
            // 超出下边界
            if (top + fHeight > Number(cHeight.slice(0, -2))) {
                currentText.top = Number(cHeight.slice(0, -2)) - fHeight - 10;
                isOutSide = true;
            }

            isOutSide && fabricObj.renderAll();
        }


        base64Image.onclick = () => {
            const base64 = canvas.toDataURL({
                format: 'png',
                quality: 1
            })
            console.log(base64);
        }

        let timer
        window.onresize = () => {
            if (timer) {
                clearTimeout(timer)
            }
            timer = setTimeout(() => {
                const { innerHeight, innerWidth } = window
                let objects = fabricObj.getObjects();
                canvas.style.width = innerWidth - 100 + 'px'
                canvas.style.height = innerHeight - 100 + 'px'
                fabricObj.setWidth(canvas.style.width.slice(0, -2));
                fabricObj.setHeight(canvas.style.height.slice(0, -2));
                fabricObj.remove.apply(fabricObj, objects);
                resizeCanvasFn(objects)
                console.log(canvas.style.width);

                console.log('尺寸发生了变化');
            }, 1000)
        }

        function resizeCanvasFn(objects) {
            // 更新所有对象的位置和大小
            const { width, height } = canvas.style
            for (let i = 0; i < objects.length; i++) {
                let object = objects[i];
                if (object.isType('image')) {
                    object.set({
                        left: width.slice(0, -2) - object.width * 0.5 - 22,
                        top: 10
                    });
                } else {
                    object.set({
                        left: width.slice(0, -2) * 0.5 - object.width * 0.5,
                        top: object.top > height.slice(0, -2) ? height.slice(0, -2) - 40 : object.top
                    });
                }
            }
            //重新将所有对象添加到画布中;
            for (let i = 0; i < objects.length; i++) {
                fabricObj.add(objects[i]);
            }
            // fabricObj.setPictureBg('https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg'); ///static/img/img.2b735807.png'
            // 设置新的背景图片路径或URL
            setBackImage()
            fabricObj.renderAll();
        }
    </script>
</body>

</html>

到了这里,关于canvas+fabric实现自定义封面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Fabric.js 使用自定义字体

    点赞 + 关注 + 收藏 = 学会了 如果你使用 Fabric.js 做编辑类的产品,有可能需要给用户配置字体。 这次就讲讲在 Fabric.js 中创建文本时 怎么使用自定义字体 、在项目运行时 怎么修改字体 、以及推荐一个 精简字体库的工具 。 学习本文前,你必须有一点 Fabric.js 的基础,如果没

    2024年02月08日
    浏览(24)
  • Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

    一、背景介绍 ​ 当我们在不想改变后端代码的同时想是纯html页面导出PDF,那么(html2canvas+jspdf)就是无疑最好的选择,导出时它不占用我们服务器的资源,而是由用户本地自行执行js文件下载PDF,不占用我们系统的带宽,所以这无非是最好的选择方式。 二、疑问 1、为什么要

    2024年01月23日
    浏览(43)
  • 前端vue基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月03日
    浏览(33)
  • fabric.js 组件 图片上传裁剪并进行自定义区域标记

    目录 0. 前言 1. 安装fabric与引入 2. fabric组件的使用 3. 属性相关设置 4. 初始化加载 4. 方法 5. 全代码 利用fabric组件,实现图片上传、图片”裁剪“、自定义的区域标记一系列操作 先放一张效果图吧👇 我用的是全局引入方式,视情况调整  先放一个fabric.js API地址☞Api | Fabric中

    2024年01月22日
    浏览(73)
  • canvas获取视频封面及个别电脑获取到空图

    PS:获取封面前提是浏览器要支持视频编码格式,不支持就不能通过该方式获取 读取视频封面: base64转file: 下载:

    2024年02月17日
    浏览(36)
  • 5个前端练手项目(html css js canvas)

     前言: 首先祝大家端午节快乐。本篇文章有5个练手项目 对于刚学完前端三剑客的你们。应该是一个很好的实践 目录 🥩.跑马灯 1.1效果图: 1.2思路解析 1.3源码 🍧.彩虹爱心 2.1效果图 2.2思路解析 2.3源码 🌮.闹钟 3.1效果图 3.2思路解析 3.3源码 🍲.自制笔记本 4.1效果展示 4

    2024年02月02日
    浏览(43)
  • 前端结合xlsx.js+xlsx-style.js源码实现自定义excel文件导出

          js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式。本文全部都是以xlsx格式为例。 创建一个excel会经历以下过程: 创建一个工作薄 创建一个sheet 创建表格行列等

    2024年03月10日
    浏览(56)
  • vue - vue中使用canvas进行前端图片合并

    如何合成一个二维码和背景图片:其实就是多次调用canvas的 drawImage 方法进行不同坐标的图像;但是因为涉及到微信长按分享图片或保存到本地,所以不能直接使用canvas来放置图片(因为微信中长按识别不出来),只能使用 img 标签来引入canvas合成的base64路径。 Canvas API 提供了

    2024年02月02日
    浏览(32)
  • 【VUE学习】权限管理系统前端vue实现4-自定义icon实现

    template 部分:定义了组件的模板内容。在这里,使用了 svg 标签来创建一个 SVG 图标元素,并添加了一个 use 元素来引用具体的图标。 :xlink:href 属性使用了绑定语法,将 iconName 绑定为 use 元素的 xlink:href 属性的值。 script setup 部分:使用了 Vue 3 的 script setup 语法,用于编写组件

    2024年02月13日
    浏览(27)
  • vue实现截取视频第一帧作为封面

    在Vue中实现截取视频第一帧作为视频封面可以通过以下步骤: 在Vue组件中引入video.js和videojs-contrib-hls插件。 在Vue组件中声明一个video元素,并给其添加id。 在Vue组件中初始化video.js插件,并监听loadedmetadata事件。 编写captureVideoThumbnail方法来截取视频第一帧。 在Vue组件中使用

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包