激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - canvas操作插件fabric.js使用方法詳解

canvas操作插件fabric.js使用方法詳解

2022-02-19 17:35daicooper js教程

這篇文章主要為大家詳細介紹了canvas操作插件fabric.js的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

fabric.js是一個很好用的 canvas 操作插件,下面整理了一些平時項目中用到的知識點:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//1: 獲得畫布上的所有對象:
var items = canvas.getObjects();
 
//2: 設置畫布上的某個對象為活動對象。
canvas.setActiveObject(items[i]);
 
//3:獲得畫布上的活動對象
canvas.getActiveObject()
 
//4:取消畫布中的所有對象的選中狀態。
canvas.discardActiveObject();
 
//5: 設置畫布中的對象的某個屬性值,比如第 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: 重新渲染一遍畫布,當畫布中的對象有變更,在最后顯示的時候,需要執行一次該操作
canvas.renderAll()
 
//8: 清除畫布中所有對象:
canvas.clear();
 
//9:清除畫布中的活動對象:
 var t = canvas.getActiveObject();
 t && canvas.remove(t);
 
//10: 設置活動對象在畫布中的層級
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:當選擇畫布中的對象時,該對象不出現在頂層。
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:代表坐標系。

canvas操作插件fabric.js使用方法詳解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//14: 畫布對象居中設置:
var t = canvas.getActiveObject();
t.center();  //全部居中
t.centerH();  //水平居中
t.centerV();  //垂直居中
t.setCoords(); //注:必須設coords以上設置才會有效。
 
//15: 當對象移動時 限制對象的 不超出畫布
// 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:當畫布對象放大時限制其操出邊界:
//注意當創建對象到畫布上時必須先加上:
 obj.saveState();
 //在對象修改時方法里就可以調用了。
 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:當生成json對象時,背景圖片顯示出來。
fabric.Image.fromURL( bgImg, function(oImg) {
   oImg.set({
     width: 400,
     height:400,
     left:0,
     top:0,
     originX: 'left',
     originY: 'top',
     opacity:0
   });
   //當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:創建蒙版層
//獲取蒙版位置屬性(非必要):
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"));
//創建蒙版
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();
}
//調用的地方:
//文字層設置蒙版
 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)
      }
});
// 圖片層設置蒙版:
// 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();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/daicooper/article/details/79800718

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本一道aⅴ不卡免费播放 久久久久久久高清 | 免费观看一区二区三区视频 | 欧美一级网址 | 国产精品成人一区二区三区电影毛片 | 欧美一级做 | 亚洲成人精品久久久 | 色综合久久99 | 国产精品视频一区二区三区四 | 日本免费一区二区三区四区 | 久久影院yy6080 | 色网免费观看 | 欧美性受xxxxxx黑人xyx性爽 | 成人在线精品视频 | 国内一区| av久草 | 中文字幕在线永久 | 久久久久久久久久久国产精品 | 国产乱乱视频 | 国产精品一区在线看 | 国产精品久久久久国产精品三级 | 暖暖免费观看高清完整版电影 | 欧美成人一区二区三区电影 | 国产xxxx岁13xxxxhd | 国产va在线观看 | 久久久久中精品中文字幕19 | 精品一区二区亚洲 | 91网站链接 | 日韩视频在线视频 | 在线中文字幕不卡 | 99最新地址 | 色综合网在线观看 | 久久精品国产清自在天天线 | 人与xxxxhdxxxhdxx 日韩黄a | 欧美一级全黄 | 少妇一级淫片免费放正片 | 黄色三级三级三级 | 一夜新娘第三季免费观看 | 久久精品久久精品久久精品 | 视频一区二区三区在线观看 | 成人毛片免费播放 | 国产做爰全免费的视频黑人 |