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

基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理

這篇具有很好參考價(jià)值的文章主要介紹了基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理

圖片上傳

使用了element-plus提供的圖片上傳el-upload組件

<el-upload :show-file-list="false" :auto-upload="false" :on-change="(e) => uploadImage(e, 'background')" >
   <button class="right-canvas-resize-btn">上傳圖片</button>
</el-upload>?

圖片上傳支持兩種元素,普通圖片元素和背景圖片元素,所以定義屬性type進(jìn)行區(qū)分

type為Image為普通圖片, background為背景

背景也是一張圖片,使用fabric.Image創(chuàng)建圖片元素

因?yàn)闆]有圖片服務(wù)器所以把上傳的文件轉(zhuǎn)換了base64圖片,作為fabric圖片的鏈接

需要區(qū)分上傳類型type, 不同類型的圖片走不同邏輯

fileUpload = async (file: File, name: string, type: string) => {
    const src = await this.handler.utils.fileToBase64(file);
    if (src) {
      const image = new Image();
      image.src = src;
      const options: any = {
        name,
        type,
        src,
      };
      await new Promise((resolve) => {
        image.onload = () => {
          options.width = image.width;
          options.height = image.height;
          resolve(true);
        };
      });
      let marterialObject;
      if (type == "background") {
        marterialObject = this.handler.workareaHandler.setBgImage(options);
      } else {
        marterialObject = this.handler.add(options);
      }
      return marterialObject;
    }
 }

背景設(shè)置原理

背景圖片和普通圖片的區(qū)別

  1. 不能選中,不能移動,不能修改,沒有操作控件

給背景元素添加以下屬性

        hasControls: false,
        hasBorders: false,
        selectable: false,
        lockMovementX: true,
        lockMovementY: true,
        lockScalingX: true,
        lockScalingY: true
  1. 背景需要自適應(yīng)畫布

計(jì)算規(guī)則如下

  • 獲取寬高比例最大值作為元素縮放值,目的是圖片元素保持寬高比例不變的情況下覆蓋畫布
  • 根據(jù)縮放值計(jì)算圖片最新寬高,需要基于畫布居中展示
  • 水平居中規(guī)則如下,垂直居中同理

基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理

 _getBgPosition(bgObject: FabricImage | any) {
    const { width, height } = this.workspace as any;
    let scale = 1;
    if (width > bgObject.width || height > bgObject.height) {
      if (width / bgObject.width > height / bgObject.height) {
        scale = width / bgObject.width;
      } else {
        scale = height / bgObject.height;
      }
    }
    // 居中
    const bgHeight = bgObject.height * scale;
    const bgWidth = bgObject.width * scale;
    const bgLeft = width / 2 - bgWidth / 2;
    const bgTop = height / 2 - bgHeight / 2;
    return {
      left: bgLeft,
      top: bgTop,
      scaleX: scale,
      scaleY: scale,
    }
  1. 背景圖片支持修改,所以上傳時(shí)需要把畫布中的背景元素給移除
 // 獲取背景元素
  getBgObject() {
    return this.handler.canvas.getObjects().find((item: any) => {
      if (item.type == "background") {
        return item;
      }
    });
  }
  
  // 去重, 防止出現(xiàn)多個背景元素
   const bgObject = this.getBgObject();
   if (bgObject && bgObject.src !== src) {
      this.handler.canvas.remove(bgObject);
   }

基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理

  1. 背景元素永遠(yuǎn)置底,但比畫布高一層,所以先置底再上移一層
      this.canvas.sendToBack(this.bgObject);
      this.canvas.bringForward(this.bgObject);
  1. 畫布中有元素層級的邏輯,所以當(dāng)我們選中某個元素的時(shí)候需要保持原有層級,但是fabric.js默認(rèn)是對象在選中時(shí)不保持在當(dāng)前堆棧位置

所以我們需要在初始化畫布時(shí)指定保留層級

preserveObjectStacking: true

完整代碼如下

async setBgImage(options: WorkareaOption) {
    const { src } = options || {};
    const editable = false;
    const option = {
      editable,
      hasControls: editable,
      hasBorders: editable,
      selectable: editable,
      lockMovementX: !editable, 
      lockMovementY: !editable,
      lockScalingX: !editable,
      lockScalingY: !editable,
      hoverCursor: "default",
      name: "背景圖片",
      type: "background",
      src,
    };
    // 去重, 防止出現(xiàn)多個背景元素
    const bgObject = this.getBgObject();
    if (bgObject && bgObject.src !== src) {
      this.handler.canvas.remove(bgObject);
    }
    const poiOptions = this._getBgPosition(options);
    const newOptions = Object.assign({}, option, poiOptions);
    this.bgObject = await this.handler.add(newOptions, false);
    if (this.bgObject) {
      this.canvas.add(this.bgObject);
      this.canvas.sendToBack(this.bgObject);
      this.canvas.bringForward(this.bgObject);
    }
    this.canvas.requestRenderAll();
    return this.bgObject;
  }

背景的翻轉(zhuǎn)、分離、刪除

支持背景圖片的翻轉(zhuǎn)、分離、刪除

基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理

翻轉(zhuǎn)

修改背景元素的scaleX屬性,默認(rèn)為水平翻轉(zhuǎn){ scaleX: -1 }

分離

修改背景元素為圖片元素

  • type修改為Image
  • 支持選中,移動,修改,有操作控件, 把上文的hasControls等字段取反即可

刪除

基于fabric提供的刪除方法 this.canvas.remove(target);

簡介

vue-design-editor 是仿搞定設(shè)計(jì)的一款開源圖片編輯器, 支持多種格式的導(dǎo)入,包括png、jpg、gif、mp4, 也可以一鍵psd轉(zhuǎn)模板(后續(xù)開發(fā))

github地址 預(yù)覽文章來源地址http://www.zghlxwxcb.cn/news/detail-783279.html

上個開源庫是 vue-form-design基于Vue3的可視化表單設(shè)計(jì)器,拖拽式操作讓你快速構(gòu)建一個表單, 讓表單開發(fā)簡單而高效。

github地址 預(yù)覽

到了這里,關(guān)于基于fabric.js的圖片編輯器, 畫布背景實(shí)現(xiàn)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • VsCode與Idea編輯器更換背景圖

    VsCode與Idea編輯器更換背景圖

    目錄 VsCode Idea VsCode 需要安裝background插件 安裝完成后,打開設(shè)置,搜索background 然后就可以在json文件進(jìn)行圖片設(shè)置,透明度等等 Idea 打開File - Settings ?然后找到Appearance ,?往下滑,找到BackGround Image,點(diǎn)擊 ?然后就會彈出背景設(shè)置的彈窗

    2024年02月14日
    瀏覽(29)
  • 【NKeditor】富文本編輯器上傳圖片

    【NKeditor】富文本編輯器上傳圖片

    使用NKeditor富文本編輯器上傳圖片,同時(shí)上傳到七牛云存儲上。后端語言使用ThinkPHP。 下載地址:NKeditor: NKedtior是一款優(yōu)秀的輕量級Web編輯器,基于 Kindedior 二次開發(fā) 里面的文檔demo寫的比較詳細(xì),可以直接使用,不過里面上傳七牛云的代碼不能用,所以我是自己寫的。? ?把

    2024年02月10日
    瀏覽(98)
  • qt+opencv實(shí)現(xiàn)圖片編輯器

    qt+opencv實(shí)現(xiàn)圖片編輯器

    借助QLabel容器,進(jìn)行顯示圖片作為背景,然后重寫QLabel類實(shí)現(xiàn)矩形,直線和圓形的實(shí)現(xiàn)。opencv板塊直接實(shí)現(xiàn)相關(guān)圖片操作。 打開圖片 裁切 改變亮度和對比度 順時(shí)針旋轉(zhuǎn)和逆時(shí)針旋轉(zhuǎn) 重寫的QLabel

    2024年02月16日
    瀏覽(26)
  • 秀米編輯器(xiumi)+百度編輯器(Ueditor) 集成 :解決集成問題,秀米編輯器導(dǎo)出到百度編輯器格式問題,圖片保存到自己的服務(wù)器(阿里云OSS)

    秀米編輯器(xiumi)+百度編輯器(Ueditor) 集成 :解決集成問題,秀米編輯器導(dǎo)出到百度編輯器格式問題,圖片保存到自己的服務(wù)器(阿里云OSS)

    1.集成前提條件: ????????1. 需要集成 百度編輯器 到環(huán)境中 ????????2. https 環(huán)境下才可以導(dǎo)出數(shù)據(jù)到百度編輯器,如果不是https環(huán)境,會出現(xiàn)錯誤 ???????? 然后我們開始講解如何集成: 2.引入資源: //百度編輯器 需要修改的文件(配置與原始的配置不一樣,后面

    2024年02月09日
    瀏覽(90)
  • wangEditor富文本編輯器圖片/視頻上傳

    wangEditor富文本編輯器圖片/視頻上傳

    wangEditor 有豐富的 API 和足夠的擴(kuò)展性,允許我們自定義開發(fā)菜單、模塊、插件等。在 Vue、React 中運(yùn)用也很方便。因此本文介紹下vue中富文本上傳圖片和視頻。 安裝引入后富文本有顯示上傳圖片按鈕,點(diǎn)擊上傳后會報(bào) 沒有配置上傳地址 的錯誤,如下圖所示: 所以自定義上傳

    2024年02月15日
    瀏覽(95)
  • Unity 編輯器工具之批量設(shè)置圖片壓縮

    Unity 編輯器工具之批量設(shè)置圖片壓縮

    一個簡單的工具,對Unity下的圖片做批量壓縮處理,主要有以下功能: 自動取消 \\\"Generte Mip Maps\\\" 勾選; 針對文件夾批量自動(或手動選擇壓縮格式)設(shè)置圖片壓縮并自動保存; 單個圖片文件的壓縮設(shè)置; 使用方法,右鍵單張圖片(或者包含圖片的文件夾) 會打開一個設(shè)置窗口 如下,窗口里會

    2024年02月10日
    瀏覽(21)
  • android項(xiàng)目實(shí)戰(zhàn)之編輯器圖片上傳預(yù)覽

    現(xiàn)狀分析 項(xiàng)目的需求用到編輯器,編輯器中又可能用到圖片上傳功能。 實(shí)現(xiàn)方案 1. 增加依賴庫,可以參考前面的幾篇文章,都有描述。 2. 核心代碼實(shí)現(xiàn) 歡迎點(diǎn)贊、收藏、轉(zhuǎn)發(fā)。

    2024年02月04日
    瀏覽(38)
  • 若依框架圖片上傳、富文本框編輯器功能

    若依框架圖片上傳、富文本框編輯器功能

    現(xiàn)在的需求是:實(shí)現(xiàn)一個項(xiàng)目展示模塊,后端管理頁面除了需要基礎(chǔ)信息外,要加上一個 圖片上傳和富文本框編輯器功能 。 點(diǎn)擊”圖片存儲地址”:可上傳電腦任何位置的圖片,并可對圖片進(jìn)行放大,縮小,和旋轉(zhuǎn)。 存入數(shù)據(jù)庫的圖片以url地址存放 url直接百度可看到圖片

    2024年04月13日
    瀏覽(140)
  • 圖片編輯器tui-image-editor

    圖片編輯器tui-image-editor

    提示:圖片編輯器tui-image-editor 需求:圖片編輯器tui-image-editor ImageEditor.vue App.vue 問題: sass-loader 版本過高,導(dǎo)致tui-image-editor的css無法解析 解決方案: 報(bào)錯內(nèi)容: 踩坑路漫漫長@~@

    2024年03月10日
    瀏覽(27)
  • 一鍵切割,激發(fā)無限創(chuàng)意:體驗(yàn)全新圖片批量編輯器

    一鍵切割,激發(fā)無限創(chuàng)意:體驗(yàn)全新圖片批量編輯器

    在數(shù)字創(chuàng)意的時(shí)代,圖片編輯成為了表達(dá)個性和創(chuàng)造力的關(guān)鍵。然而,傳統(tǒng)的圖片編輯工具常常讓人望而生畏,復(fù)雜的操作和高門檻的技術(shù)要求使得許多人望而卻步?,F(xiàn)在,我們?yōu)槟鷰硪豢钊碌膱D片批量編輯器,只需一鍵切割,就能釋放您無限的創(chuàng)意火花! “圖片批量編

    2024年03月18日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包