canvas操作插件fabric.js使用方法詳解
更新時間:2021年03月18日 08:52:12 作者:daicooper
這篇文章主要為大家詳細(xì)介紹了canvas操作插件fabric.js的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
fabric.js是一個很好用的 canvas 操作插件,下面整理了一些平時項(xiàng)目中用到的知識點(diǎn):
//1: 獲得畫布上的所有對象: var items = canvas.getObjects(); //2: 設(shè)置畫布上的某個對象為活動對象。 canvas.setActiveObject(items[i]); //3:獲得畫布上的活動對象 canvas.getActiveObject() //4:取消畫布中的所有對象的選中狀態(tài)。 canvas.discardActiveObject(); //5: 設(shè)置畫布中的對象的某個屬性值,比如第 0 個對象的 id var items = canvas.getObjects(); tems[0].id ="items_id0" 或 items[0].set("id","items_id0") //6:獲得畫布中對象的某個屬性,比如 第0 個對象的 id var items = canvas.getObjects(); items[0].id; //或 items[0].get("id"); //7: 重新渲染一遍畫布,當(dāng)畫布中的對象有變更,在最后顯示的時候,需要執(zhí)行一次該操作 canvas.renderAll() //8: 清除畫布中所有對象: canvas.clear(); //9:清除畫布中的活動對象: var t = canvas.getActiveObject(); t && canvas.remove(t); //10: 設(shè)置活動對象在畫布中的層級 var t = canvas.getActiveObject(); canvas.sendBackwards(t) //向下跳一層 canvas.sendToBack(t) //向下跳底層: canvas.bringForward(t) //向上跳一層: canvas.bringToFront(t) //向上跳頂層: //或者: t.sendBackwards(); t.sendToBack(); t.bringForward(); t.bringToFront(); //10:加載圖片時圖片縮放到指定的大小。 fabric.Image.fromURL(image_src, function(oImg) { oImg.set({ left:tmp_left, top:tmp_top, centeredScaling:true, cornerSize: 7, cornerColor: "#9cb8ee", transparentCorners: false, }); oImg.scaleToWidth(image_width); oImg.scaleToHeight(image_height); canvas.add(oImg).setActiveObject(oImg); }); //11:當(dāng)選擇畫布中的對象時,該對象不出現(xiàn)在頂層。 canvas.preserveObjectStacking = true; // 12:為畫布通過URL方式添加背景圖片 var bg_url = "http://www.xxxx.com/...../bg.png" fabric.Image.fromURL( bg_url , function(oImg) { oImg.set({ width: canvas_obj.width, height: canvas_obj.height, originX: 'left', originY: 'top' }); canvas_obj.setBackgroundImage(oImg, canvas_obj.renderAll.bind(canvas_obj)); }); //13: originx: originy:代表坐標(biāo)系。
//14: 畫布對象居中設(shè)置: var t = canvas.getActiveObject(); t.center(); //全部居中 t.centerH(); //水平居中 t.centerV(); //垂直居中 t.setCoords(); //注:必須設(shè)coords以上設(shè)置才會有效。 //15: 當(dāng)對象移動時 限制對象的 不超出畫布 // canvas moving limit function objectMoving(e){ var obj = e.target; if(obj.currentHeight > obj.canvas.height || obj.currentWidth > obj.canvas.width){ return; } obj.setCoords(); // top-left corner if(obj.getBoundingRect().top < 0 || obj.getBoundingRect().left < 0){ obj.top = Math.max(obj.top, obj.top-obj.getBoundingRect().top); obj.left = Math.max(obj.left, obj.left-obj.getBoundingRect().left); } // bot-right corner if(obj.getBoundingRect().top+obj.getBoundingRect().height > obj.canvas.height || obj.getBoundingRect().left+obj.getBoundingRect().width > obj.canvas.width){ obj.top = Math.min(obj.top, obj.canvas.height-obj.getBoundingRect().height+obj.top-obj.getBoundingRect().top); obj.left = Math.min(obj.left, obj.canvas.width-obj.getBoundingRect().width+obj.left-obj.getBoundingRect().left); } } //16:當(dāng)畫布對象放大時限制其操出邊界: //注意當(dāng)創(chuàng)建對象到畫布上時必須先加上: obj.saveState(); //在對象修改時方法里就可以調(diào)用了。 function objectModified (e) { let obj = e.target; let boundingRect = obj.getBoundingRect(true); if (boundingRect.left < 0 || boundingRect.top < 0 || boundingRect.left + boundingRect.width > obj.canvas.getWidth() || boundingRect.top + boundingRect.height > obj.canvas.getHeight()) { obj.top = obj._stateProperties.top; obj.left = obj._stateProperties.left; obj.angle = obj._stateProperties.angle; obj.scaleX = obj._stateProperties.scaleX; obj.scaleY = obj._stateProperties.scaleY; obj.setCoords(); obj.saveState(); }else{ obj.saveState(); } } //17:當(dāng)生成json對象時,背景圖片顯示出來。 fabric.Image.fromURL( bgImg, function(oImg) { oImg.set({ width: 400, height:400, left:0, top:0, originX: 'left', originY: 'top', opacity:0 }); //當(dāng)toObject方法時顯示背景圖片。 oImg.toObject = (function(toObject) { return function() { return fabric.util.object.extend(toObject.call(this), { opacity:1 }); }; })(oImg.toObject); canvas_obj.setBackgroundImage(oImg, canvas_obj.renderAll.bind(canvas_obj)); }, { crossOrigin: 'Anonymous' }); //18:創(chuàng)建蒙版層 //獲取蒙版位置屬性(非必要): var maskLayerTop = parseInt($(this).attr("data-top")); var maskLayerLeft = parseInt($(this).attr("data-left")); var maskLayerWidth = parseInt($(this).attr("data-width")); var maskLayerHeight = parseInt($(this).attr("data-height")); //創(chuàng)建蒙版 var clipMask = new fabric.Rect({ originX: 'left', originY: 'top', left: maskLayerLeft, top: maskLayerTop, width: maskLayerWidth, height: maskLayerHeight, fill: 'rgba(0,0,0,0)', strokeWidth:0, selectable: false }); clipMask.set({ clipFor: 'pug' }); canvas_obj.add(clipMask); function degToRad(degrees) { return degrees * (Math.PI / 180); } function findByClipName(name){ return _(canvas_obj.getObjects()).where({ clipFor: name }).first() } canvas_obj.clipByName = function(ctx) { this.setCoords(); var clipObj = findByClipName(this.clipName); var scaleXTo1 = (1 / this.scaleX); var scaleYTo1 = (1 / this.scaleY); var skewXReverse = - this.skewX; var skewYReverse = - this.skewY; ctx.save(); var ctxLeft = -( this.width / 2 ) + clipObj.strokeWidth; var ctxTop = -( this.height / 2 ) + clipObj.strokeWidth; var ctxWidth = clipObj.width - clipObj.strokeWidth; var ctxHeight = clipObj.height - clipObj.strokeWidth; ctx.translate( ctxLeft, ctxTop ); ctx.scale(scaleXTo1, scaleYTo1); ctx.transform(1, skewXReverse, skewYReverse, 1, 0, 0); ctx.rotate(degToRad(this.angle * -1)); ctx.beginPath(); ctx.rect( clipObj.left - this.oCoords.tl.x, clipObj.top - this.oCoords.tl.y, clipObj.width, clipObj.height ); ctx.closePath(); ctx.restore(); } //調(diào)用的地方: //文字層設(shè)置蒙版 var t = new fabric.Text("Your Text", { id: first_level+"-text-input"+unique_id, cornerSize: 7, cornerColor: "#9cb8ee", transparentCorners: false, textAlign:"center", clipName: 'pug', clipTo: function(ctx) { return _.bind(tmp_canvas_obj.clipByName, t)(ctx) } }); // 圖片層設(shè)置蒙版: // add the forntimage to the canvas fabric.Image.fromURL(image_src, function(oImg) { oImg.set({ id:first_level+"-image-input"+unique_id, left:tmp_left, top:tmp_top, centeredScaling:true, cornerSize: 7, cornerColor: "#9cb8ee", transparentCorners: false, clipName: 'pug', clipTo: function(ctx) { return _.bind(tmp_canvas_obj.clipByName, oImg)(ctx) } }); //19:生成的圖片縮放到指定的尺寸。 oImg.scaleToWidth(image_width); oImg.scaleToHeight(image_height); //20:to object 時添加 id屬性。 oImg.toObject = (function(toObject) { return function() { return fabric.util.object.extend(toObject.call(this), { id: this.id, }); }; })(oImg.toObject); oImg.id = first_level+"-image-input"+unique_id; oImg.saveState(); tmp_canvas_obj.add(oImg).setActiveObject(oImg); }, { crossOrigin: 'Anonymous' }); tmp_canvas_obj.renderAll();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一文解決微信小程序button、input和image表單組件
在微信小程序開發(fā)中,input?用來實(shí)現(xiàn)文本輸入,如輸入用戶名密碼等等,下面這篇文章主要給大家介紹了關(guān)于如何通過一文解決微信小程序button、input和image表單組件的相關(guān)資料,需要的朋友可以參考下2022-08-08JS表格組件BootstrapTable行內(nèi)編輯解決方案x-editable
這篇文章主要介紹了JS組件系列BootstrapTable行內(nèi)編輯解決方案:x-editable,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09收集的一些Array及String原型對象的擴(kuò)展實(shí)現(xiàn)代碼
收集的一些Array及String原型對象的擴(kuò)展實(shí)現(xiàn)代碼,學(xué)習(xí)js的朋友可以參考下。并可以自定義的對字符串與array數(shù)據(jù),進(jìn)行擴(kuò)展。2010-12-12JS實(shí)現(xiàn)仿UC瀏覽器前進(jìn)后退效果的實(shí)例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)仿UC瀏覽器前進(jìn)后退效果的實(shí)例代碼,實(shí)現(xiàn)此功能前需要先測試下瀏覽器,具體實(shí)例代碼,大家參考下本文2017-07-07javascript實(shí)現(xiàn)十秒鐘后注冊按鈕可點(diǎn)擊的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)十秒鐘后注冊按鈕可點(diǎn)擊的方法,涉及javascript時間及樣式操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05