国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久成人免费视频 | 久久99国产精品久久99果冻传媒 | 国产四区 | 在线国v免费看 | 久色网| 黄色在线网站 | 久久久免费网站 | 欧美午夜一区二区三区免费大片 | 一区二区三区精品视频免费看 | 青青草视频在线免费观看 | 亚洲午夜电影在线 | 网站av| 亚洲国产aⅴ成人精品无吗 久久久91 | 久久中文字幕一区 | 国产福利在线 | 久久国产精品视频 | 激情五月激情综合网 | 狠狠综合久久av一区二区老牛 | 我要看免费黄色片 | 精品av| 欧美日韩久久久久 | 亚洲精品一区 | 欧美日韩91 | 最新国产一区二区 | 在线观看av网站 | 亚洲乱码国产乱码精品精98午夜 | 综合久久av | 久久艹综合 | 欧美日韩一区二区三区不卡视频 | 免费国产一区 | 欧洲精品久久久久毛片完整版 | a天堂在线 | 国产区在线 | 午夜窝窝 | 久久久久久黄 | 亚洲网站在线观看 | 日韩性视频 | 免费簧片| 特黄特色大片在线观看视频网站 | 久草在线免费资源 | 国产精品久久久久久久午夜片 |