国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

canvas+fabric實現(xiàn)自定義封面

這篇具有很好參考價值的文章主要介紹了canvas+fabric實現(xiàn)自定義封面。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

canvas+fabric實現(xiàn)自定義封面,fabric,javascript,前端,vue.js文章來源地址http://www.zghlxwxcb.cn/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')
        //  設(shè)置畫布寬高  可以動態(tài)設(shè)置畫布寬高,如果在標(biāo)簽上也設(shè)置了寬高,則會將其覆蓋掉
        fabricObj.setWidth(500)
        fabricObj.setHeight(500)
        // 設(shè)置背景圖
        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) {
                // 創(chuàng)建文本對象并設(shè)置相關(guān)屬性
                cur = new fabric.Textbox(
                    '阿里士大夫艱苦', {
                    lineHeight: 1.2,
                    left: 5,
                    top: 40,
                    fontSize: 40,
                    fontFamily: 'HanKangLiJinhei',
                    fill: '#000',
                    stroke: 'blue', // 設(shè)置描邊顏色為黑色
                    strokeWidth: 1, // 設(shè)置描邊寬度為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('尺寸發(fā)生了變化');
            }, 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'
            // 設(shè)置新的背景圖片路徑或URL
            setBackImage()
            fabricObj.renderAll();
        }
    </script>
</body>

</html>

到了這里,關(guān)于canvas+fabric實現(xiàn)自定義封面的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Fabric.js 使用自定義字體

    Fabric.js 使用自定義字體

    點贊 + 關(guān)注 + 收藏 = 學(xué)會了 如果你使用 Fabric.js 做編輯類的產(chǎn)品,有可能需要給用戶配置字體。 這次就講講在 Fabric.js 中創(chuàng)建文本時 怎么使用自定義字體 、在項目運行時 怎么修改字體 、以及推薦一個 精簡字體庫的工具 。 學(xué)習(xí)本文前,你必須有一點 Fabric.js 的基礎(chǔ),如果沒

    2024年02月08日
    瀏覽(13)
  • Html轉(zhuǎn)PDF,前端JS實現(xiàn)Html頁面導(dǎo)出PDF(html2canvas+jspdf)

    Html轉(zhuǎn)PDF,前端JS實現(xiàn)Html頁面導(dǎo)出PDF(html2canvas+jspdf)

    一、背景介紹 ? 當(dāng)我們在不想改變后端代碼的同時想是純html頁面導(dǎo)出PDF,那么(html2canvas+jspdf)就是無疑最好的選擇,導(dǎo)出時它不占用我們服務(wù)器的資源,而是由用戶本地自行執(zhí)行js文件下載PDF,不占用我們系統(tǒng)的帶寬,所以這無非是最好的選擇方式。 二、疑問 1、為什么要

    2024年01月23日
    瀏覽(25)
  • 前端vue基于html2canva jspdf 實現(xiàn)前端頁面加水印 并導(dǎo)出頁面PDF

    前端vue基于html2canva jspdf 實現(xiàn)前端頁面加水印 并導(dǎo)出頁面PDF

    隨著技術(shù)的發(fā)展,開發(fā)的復(fù)雜度也越來越高,傳統(tǒng)開發(fā)方式將一個系統(tǒng)做成了整塊應(yīng)用,經(jīng)常出現(xiàn)的情況就是一個小小的改動或者一個小功能的增加可能會引起整體邏輯的修改,造成牽一發(fā)而動全身。通過組件化開發(fā),可以有效實現(xiàn)單獨開發(fā),單獨維護,而且他們之間可以隨

    2024年02月03日
    瀏覽(28)
  • fabric.js 組件 圖片上傳裁剪并進行自定義區(qū)域標(biāo)記

    fabric.js 組件 圖片上傳裁剪并進行自定義區(qū)域標(biāo)記

    目錄 0. 前言 1. 安裝fabric與引入 2. fabric組件的使用 3. 屬性相關(guān)設(shè)置 4. 初始化加載 4. 方法 5. 全代碼 利用fabric組件,實現(xiàn)圖片上傳、圖片”裁剪“、自定義的區(qū)域標(biāo)記一系列操作 先放一張效果圖吧?? 我用的是全局引入方式,視情況調(diào)整? 先放一個fabric.js API地址?Api | Fabric中

    2024年01月22日
    瀏覽(43)
  • canvas獲取視頻封面及個別電腦獲取到空圖

    PS:獲取封面前提是瀏覽器要支持視頻編碼格式,不支持就不能通過該方式獲取 讀取視頻封面: base64轉(zhuǎn)file: 下載:

    2024年02月17日
    瀏覽(21)
  • 5個前端練手項目(html css js canvas)

    5個前端練手項目(html css js canvas)

    ?前言: 首先祝大家端午節(jié)快樂。本篇文章有5個練手項目 對于剛學(xué)完前端三劍客的你們。應(yīng)該是一個很好的實踐 目錄 ??.跑馬燈 1.1效果圖: 1.2思路解析 1.3源碼 ??.彩虹愛心 2.1效果圖 2.2思路解析 2.3源碼 ??.鬧鐘 3.1效果圖 3.2思路解析 3.3源碼 ??.自制筆記本 4.1效果展示 4

    2024年02月02日
    瀏覽(55)
  • 前端結(jié)合xlsx.js+xlsx-style.js源碼實現(xiàn)自定義excel文件導(dǎo)出

    前端結(jié)合xlsx.js+xlsx-style.js源碼實現(xiàn)自定義excel文件導(dǎo)出

    ??????js-xlsx是一款非常方便的只需要純JS即可讀取和導(dǎo)出excel的工具庫,功能強大,支持格式眾多,支持xls、xlsx、ods(一種OpenOffice專有表格文件格式)等十幾種格式。本文全部都是以xlsx格式為例。 創(chuàng)建一個excel會經(jīng)歷以下過程: 創(chuàng)建一個工作薄 創(chuàng)建一個sheet 創(chuàng)建表格行列等

    2024年03月10日
    瀏覽(33)
  • vue - vue中使用canvas進行前端圖片合并

    vue - vue中使用canvas進行前端圖片合并

    如何合成一個二維碼和背景圖片:其實就是多次調(diào)用canvas的 drawImage 方法進行不同坐標(biāo)的圖像;但是因為涉及到微信長按分享圖片或保存到本地,所以不能直接使用canvas來放置圖片(因為微信中長按識別不出來),只能使用 img 標(biāo)簽來引入canvas合成的base64路徑。 Canvas API 提供了

    2024年02月02日
    瀏覽(18)
  • 【VUE學(xué)習(xí)】權(quán)限管理系統(tǒng)前端vue實現(xiàn)4-自定義icon實現(xiàn)

    template 部分:定義了組件的模板內(nèi)容。在這里,使用了 svg 標(biāo)簽來創(chuàng)建一個 SVG 圖標(biāo)元素,并添加了一個 use 元素來引用具體的圖標(biāo)。 :xlink:href 屬性使用了綁定語法,將 iconName 綁定為 use 元素的 xlink:href 屬性的值。 script setup 部分:使用了 Vue 3 的 script setup 語法,用于編寫組件

    2024年02月13日
    瀏覽(25)
  • vue實現(xiàn)截取視頻第一幀作為封面

    在Vue中實現(xiàn)截取視頻第一幀作為視頻封面可以通過以下步驟: 在Vue組件中引入video.js和videojs-contrib-hls插件。 在Vue組件中聲明一個video元素,并給其添加id。 在Vue組件中初始化video.js插件,并監(jiān)聽loadedmetadata事件。 編寫captureVideoThumbnail方法來截取視頻第一幀。 在Vue組件中使用

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包