centaline-data-driven 1.4.58 → 1.4.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,6 +56,7 @@ const paths = {
56
56
  "browseIframe": "./src/centaline/browseIframe/index.js", //URL弹层
57
57
  "dynamicViewerFile": "./src/centaline/dynamicViewerFile/index.js", //图片预览框组件
58
58
  "dynamicDragSort": "./src/centaline/dynamicDragSort/index.js", //上下拖拽排序组件
59
+ "dynamicEditPictures": "./src/centaline/dynamicEditPictures/index.js", //图片编辑组件
59
60
  },
60
61
  "plugs": {
61
62
  "api": "./src/centaline/api/index.js", //调用API插件
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaline-data-driven",
3
- "version": "1.4.58",
3
+ "version": "1.4.59",
4
4
  "description": "ccai",
5
5
  "author": "hjc <3226136347@qq.com>",
6
6
  "private": false,
@@ -15,6 +15,7 @@
15
15
  "axios": "^0.24.0",
16
16
  "babel-polyfill": "^6.26.0",
17
17
  "compression-webpack-plugin": "^2.0.0",
18
+ "cropperjs": "^1.5.13",
18
19
  "element-ui": "^2.15.7",
19
20
  "module": "^1.2.5",
20
21
  "sass": "^1.34.0",
@@ -0,0 +1,11 @@
1
+ import dynamicEditPictures from './src/dynamicEditPictures'
2
+
3
+ dynamicEditPictures.install = function (Vue) {
4
+ Vue.component(dynamicEditPictures.name, dynamicEditPictures);
5
+ }
6
+
7
+ if (typeof window !== 'undefined' && window.Vue) {
8
+ window.Vue.use(dynamicEditPictures);
9
+ }
10
+
11
+ export default dynamicEditPictures;
@@ -0,0 +1,604 @@
1
+ <template>
2
+ <div class="magnify-modal" style="width:100%; height:100%;background-color: #1e1e1e">
3
+ <div class="magnify-stage">
4
+ <canvas id="drawCanvas" ref="canvas" style="position:absolute;"></canvas>
5
+ </div>
6
+ <div class="magnify-Original" v-if="flagOriginal">
7
+ <el-row>
8
+ <el-button type="success" @click="Original()">原图</el-button>
9
+ </el-row>
10
+ </div>
11
+ <div class="magnify-cropper" v-if="croppShow">
12
+ <el-row>
13
+ <el-button type="success" @click="sureCropper()"><i class="el-icon-check"></i></el-button>
14
+ <el-button type="primary" @click="cancelCropper()"><i class="el-icon-close"></i></el-button>
15
+ </el-row>
16
+ </div>
17
+ <div class="magnify-footer" v-else>
18
+ <div class="magnify-toolbar">
19
+ <a @click="rotLeft" class="magnify-btn" title="左旋转">
20
+ <span class="el-icon-refresh-left"></span>
21
+ </a>
22
+ <a @click="rotRight" class="magnify-btn" title="右旋转">
23
+ <span class="el-icon-refresh-right"></span>
24
+ </a>
25
+ <a @click="Crop" class="magnify-btn" title="裁剪">
26
+ <span class="el-icon-crop"></span>
27
+ </a>
28
+ <a @click="Drag" class="magnify-btn" title="拖动">
29
+ <span class="el-icon-rank"></span>
30
+ </a>
31
+ <a @click="Apply" class="magnify-btn" title="涂抹">
32
+ <span class="el-icon-brush"></span>
33
+ </a>
34
+ <a @click="enlarge" class="magnify-btn" title="放大">
35
+ <span class="el-icon-zoom-in"></span>
36
+ </a>
37
+ <a @click="narrow" class="magnify-btn" title="缩小">
38
+ <span class="el-icon-zoom-out"></span>
39
+ </a>
40
+ <a @click="clear" class="magnify-btn" title="清除">
41
+ <span class="el-icon-refresh"></span>
42
+ </a>
43
+ <a @click="preservation" class="magnify-btn" title="保存">
44
+ <span class="el-icon-check"></span>
45
+ </a>
46
+
47
+ </div>
48
+ </div>
49
+ <div class="stream-total-tips" v-if="progressFlag">
50
+ <el-progress type="circle"
51
+ :percentage="typeof loadProgress !== 'undefined' && loadProgress !== null ? loadProgress : 0.00"
52
+ :width="150" :height="150" class="file-cirle"></el-progress>
53
+ </div>
54
+ <div class="mask" v-if="progressFlag"></div>
55
+ </div>
56
+ </template>
57
+ <script>
58
+ import dynamicElement from "../../mixins/dynamicElement";
59
+ import { upload, uploadByPieces } from "../../loader/src/ctl/SliceUpload";
60
+ import Enum from '../../loader/src/ctl/lib/Enum';
61
+ import Cropper from 'cropperjs'
62
+ import 'cropperjs/dist/cropper.min.css'
63
+ export default {
64
+ name: "ct-editpictures",
65
+ mixins: [dynamicElement],
66
+ props: {
67
+ file: Object,
68
+ api: String,
69
+ minWidth: Number,
70
+ minHeight: Number
71
+ },
72
+ data() {
73
+ return {
74
+ flagOriginal: false,
75
+ progressFlag: false,
76
+ loadProgress: 0,
77
+ cropper: null,
78
+ croppShow: false,
79
+ canvas: Object,
80
+ ctx: Object,
81
+ imgObj: Object,
82
+ rot: 0,
83
+ canMove: false,
84
+ PaintMove: false,
85
+ isActive: false,
86
+ tx: 0,
87
+ ty: 0,
88
+ tl: 0,
89
+ tt: 0,
90
+ startX: 0,
91
+ startY: 0,
92
+ nl: 0,
93
+ nt: 0,
94
+ ratio: 0,
95
+ cropBoxResizable: false,
96
+ }
97
+ },
98
+ computed: {
99
+
100
+ },
101
+ mounted() {
102
+ this.progressFlag = false;
103
+ this.loadProgress = 0;
104
+ if (typeof this.minWidth == 'undefined' || typeof this.minWidth == 'undefined') {
105
+ this.cropBoxResizable = true;
106
+ }
107
+ if (typeof this.file.originalSavedFileName !== 'undefined' && this.file.originalSavedFileName !== this.file.savedFileName) {
108
+ this.flagOriginal = true;
109
+ }
110
+ console.log(this.file);
111
+ this.drawCanv();
112
+ },
113
+ methods: {
114
+ drawCanv(href) {
115
+ this.$nextTick(() => {
116
+ let _this = this
117
+ _this.canvas = document.getElementById('drawCanvas');
118
+ _this.ctx = _this.canvas.getContext("2d");
119
+
120
+ _this.canvas.width = 0;
121
+ _this.canvas.height = 0;
122
+
123
+ _this.imgObj = new Image()
124
+ _this.imgObj.src = href||_this.file.mediaUrl;
125
+ _this.imgObj.setAttribute("crossOrigin", 'Anonymous')
126
+ _this.imgObj.onload = function (e) {
127
+ //获取原始宽高
128
+ let naturalWidth = (e.path)[0].naturalWidth
129
+ let naturalHeight = (e.path)[0].naturalHeight
130
+
131
+ _this.canvas.width = naturalWidth;
132
+ _this.canvas.height = naturalHeight;
133
+ _this.ctx.drawImage(_this.imgObj, 0, 0, naturalWidth, naturalHeight)
134
+
135
+ var scale = 1;
136
+ var scalew = 900 / _this.imgObj.width;
137
+ var scaleh = window.document.body.clientHeight / _this.imgObj.height;
138
+ if (scalew < 1 && scaleh < 1) {
139
+ if (scalew < scaleh) {
140
+ scale = scalew;
141
+ }
142
+ else {
143
+ scale = scaleh;
144
+ }
145
+ }
146
+ else if (scalew > 1 && scaleh < 1) {
147
+ scale = scaleh;
148
+ }
149
+ else if (scalew < 1 && scaleh > 1) {
150
+ scale = scalew;
151
+ }
152
+ _this.scaleDomSize(_this.canvas, scale);
153
+ }
154
+ this.canvas.addEventListener("pointerdown", _this.startDraw, false);
155
+ this.canvas.addEventListener("pointermove", _this.draw, false);
156
+ this.canvas.addEventListener("pointerup", _this.endDraw, false);
157
+ this.canvas.addEventListener("pointerout", _this.outdraw, false);
158
+ })
159
+ },
160
+ outdraw() {
161
+ this.isActive = false;
162
+ },
163
+ draw(e) {
164
+ e.preventDefault();
165
+ if (this.isActive && this.PaintMove) {
166
+ var x = e.offsetX || e.layerX - canvas.offsetLeft;
167
+ var y = e.offsetY || e.layerY - canvas.offsetTop;
168
+ var sw = 0;
169
+ var sh = 0;
170
+ var sx = 0;
171
+ var sy = 0;
172
+
173
+ if (x >= this.startX) {
174
+ sw = x - this.startX;
175
+ sx = this.startX;
176
+ }
177
+ else if (x < this.startX) {
178
+ sw = this.startX - x;
179
+ sx = x;
180
+ }
181
+ if (y >= this.startY) {
182
+ sh = y - this.startY;
183
+ sy = this.startY;
184
+ }
185
+ else if (y < this.startY) {
186
+ sh = this.startY - y;
187
+ sy = y;
188
+ }
189
+ if (sw != 0 && sh != 0) {
190
+ var data = this.ctx.getImageData(sx, sy, sw, sh);
191
+ //将图像数据进行高斯模糊 data.data是一个数组,每四个值代表一个像素点的rgba的值,data.width data.height 分别代表图像数据的宽高
192
+ var emptyData = this.gaussBlur(data);
193
+ //将模糊的图像数据再渲染到画布上面
194
+ this.ctx.putImageData(emptyData, sx, sy);
195
+ }
196
+
197
+ }
198
+ else if (this.isActive && this.canMove) {
199
+ //获取x和y
200
+ var nx = e.clientX;
201
+ var ny = e.clientY;
202
+ //计算移动后的左偏移量和顶部的偏移量
203
+ this.nl = nx - (this.tx - this.tl);
204
+ this.nt = ny - (this.ty - this.tt);
205
+ this.canvas.style.left = this.nl + 'px';
206
+ this.canvas.style.top = this.nt + 'px';
207
+ }
208
+ },
209
+ startDraw(e) {
210
+ if (this.canMove) {
211
+ //获取x坐标和y坐标
212
+ this.tx = e.clientX;
213
+ this.ty = e.clientY;
214
+ //获取左部和顶部的偏移量
215
+ this.tl = this.canvas.offsetLeft;
216
+ this.tt = this.canvas.offsetTop;
217
+ //设置样式
218
+ this.canvas.style.cursor = 'move';
219
+ }
220
+ else if (this.PaintMove) {
221
+ e.preventDefault();
222
+ this.startX = e.offsetX;
223
+ this.startY = e.offsetY;
224
+ this.ctx.beginPath();
225
+ }
226
+ this.isActive = true;
227
+ },
228
+
229
+ endDraw(e) {
230
+ if (this.canMove) {
231
+ this.canvas.style.cursor = 'default';
232
+ }
233
+ else if (this.PaintMove) {
234
+ e.preventDefault();
235
+ }
236
+ this.isActive = false;
237
+ },
238
+
239
+ enlarge() {
240
+ this.scaleDom(this.canvas, "+");
241
+ },
242
+ narrow() {
243
+ this.scaleDom(this.canvas, "-");
244
+ },
245
+ //放大缩小
246
+ scaleDom(canvas, type) {
247
+ let scale = parseFloat((canvas.style.transform || `scale(1)`).replace(/[^0-9.]/gi, ''))
248
+ if (type == "-") {
249
+ scale += -0.1;
250
+ if ((scale <= 1 && canvas.width > 900) || (scale <= 1 && canvas.height > (window.document.body.clientHeight))) {
251
+ canvas.style.left = - canvas.width * 0.05 * ((1 - scale) * 10) + 'px';
252
+ canvas.style.top = -canvas.height * 0.05 * ((1 - scale) * 10) + 'px';
253
+ }
254
+ } else if (type == "+") {
255
+ scale += 0.1;
256
+ if ((scale <= 1 && canvas.width > 900) || (scale <= 1 && canvas.height > (window.document.body.clientHeight))) {
257
+ canvas.style.left = - canvas.width * 0.05 * ((1 - scale) * 10) + 'px';
258
+ canvas.style.top = -canvas.height * 0.05 * ((1 - scale) * 10) + 'px';
259
+ }
260
+ }
261
+ else {
262
+ scale = 1;
263
+ }
264
+ if (scale >= 0.1) canvas.style.transform = `scale(${scale})`;
265
+
266
+ },
267
+ rotLeft() {
268
+ this.rot -= 90;
269
+ if (this.rot === -90) {
270
+ this.rot = 270;
271
+ }
272
+ this.rotate(this.canvas, this.imgObj, this.rot);
273
+ },
274
+ rotRight() {
275
+ this.rot += 90;
276
+ this.rotate(this.canvas, this.imgObj, this.rot);
277
+ if (this.rot === 270) {
278
+ this.rot = -90;
279
+ }
280
+ },
281
+ rotate(canvas, img, rot) {
282
+ //获取图片的高宽
283
+ var w = img.width;
284
+ var h = img.height;
285
+ //角度转为弧度
286
+ if (!rot) {
287
+ rot = 0;
288
+ }
289
+ var rotation = Math.PI * rot / 180;
290
+ var c = Math.round(Math.cos(rotation) * 1000) / 1000;
291
+ var s = Math.round(Math.sin(rotation) * 1000) / 1000;
292
+ //旋转后canvas标签的大小
293
+ canvas.height = Math.abs(c * h) + Math.abs(s * w);
294
+ canvas.width = Math.abs(c * w) + Math.abs(s * h);
295
+ //绘图开始
296
+ var context = canvas.getContext("2d");
297
+ context.save();
298
+ //改变中心点
299
+ if (rotation <= Math.PI / 2) {
300
+ context.translate(s * h, 0);
301
+ } else if (rotation <= Math.PI) {
302
+ context.translate(canvas.width, -c * h);
303
+ } else if (rotation <= 1.5 * Math.PI) {
304
+ context.translate(-c * w, canvas.height);
305
+ } else {
306
+ context.translate(0, -s * w);
307
+ }
308
+ //旋转90°
309
+ context.rotate(rotation);
310
+ //绘制
311
+ context.drawImage(img, 0, 0, w, h);
312
+ context.restore();
313
+ img.style.display = "none";
314
+ },
315
+ Crop() {
316
+ let _this = this
317
+ this.drawCanv()
318
+ this.croppShow = true
319
+ let cropper = new Cropper(this.$refs.canvas, {
320
+ checkCrossOrigin: true,
321
+ viewMode: 1,
322
+ dragMode: 'move',
323
+ cropBoxResizable: _this.cropBoxResizable,
324
+ data: {
325
+ width: this.minWidth || 800,
326
+ height: this.minHeight || 600
327
+ },
328
+ zoom(e) {
329
+ if (_this.ratio == 0) {
330
+ _this.ratio = e.detail.oldRatio
331
+ }
332
+ if (e.detail.ratio > _this.ratio) {
333
+ e.preventDefault();
334
+ }
335
+ },
336
+ })
337
+ this.cropper = cropper
338
+ },
339
+ // 确认裁剪
340
+ sureCropper() {
341
+ let _this = this
342
+ this.cropper.getCroppedCanvas().toBlob(function (blob) {
343
+ const href = window.URL.createObjectURL(blob)
344
+ _this.drawCanv(href)
345
+ }, 'image/jpeg')
346
+ this.cancelCropper()
347
+ },
348
+ // 销毁裁剪框
349
+ cancelCropper() {
350
+ this.cropper.destroy()
351
+ this.croppShow = false
352
+ this.cropper = null
353
+ },
354
+ Original() {
355
+ var url = this.file.mediaUrl.replace(this.file.savedFileName, this.file.originalSavedFileName);
356
+ this.drawCanv(url);
357
+ },
358
+ Drag() {
359
+ this.canMove = true;
360
+ this.PaintMove = false;
361
+ },
362
+ Apply() {
363
+ this.PaintMove = true;
364
+ this.canMove = false;
365
+ },
366
+ clear() {
367
+ this.drawCanv();
368
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
369
+ this.canvas.style.left = '0px';
370
+ this.canvas.style.top = '0px';
371
+ this.rot = 0;
372
+ this.nl = 0;
373
+ this.nt = 0;
374
+ this.scaleDom(this.canvas, "");
375
+ this.rotate(this.canvas, this.imgObj, this.rot);
376
+ },
377
+ scaleDomSize(canvas, scale) {
378
+ if ((scale <= 1 && canvas.width > 900) || (scale <= 1 && canvas.height > (window.document.body.clientHeight))) {
379
+ canvas.style.left = - canvas.width * 0.05 * ((1 - scale) * 10) + 'px';
380
+ canvas.style.top = -canvas.height * 0.05 * ((1 - scale) * 10) + 'px';
381
+ }
382
+ if (scale >= 0.1) canvas.style.transform = `scale(${scale})`;
383
+ },
384
+ async preservation() {
385
+ this.progressFlag = true;
386
+ this.loadProgress = 0;
387
+ var url = this.canvas.toDataURL('image/jpeg');
388
+ var files = this.convertBase64UrlToFile(url, this.file.fileName);
389
+ // data是上传时附带的额外参数,file是文件
390
+ let uid = this.uploadguid();
391
+ try {
392
+ files.uid = uid;
393
+ const res = await uploadByPieces(this.api, files, this.uploadpro, files.size);
394
+ return res;
395
+
396
+ } catch (e) {
397
+ return e;
398
+ }
399
+ },
400
+ uploadpro(filesize, res, xhr, flagError) {
401
+ if (flagError) {
402
+ this.$message.error(res);
403
+ return false;
404
+ }
405
+ else if (xhr.status == 200) {
406
+ if (res.rtnCode != 200 && res.rtnMsg != "") {
407
+ this.$message.error(res.rtnMsg);
408
+ return false;
409
+ }
410
+ const Progress = Math.min(100, Math.floor(1E4 * parseInt(res.content.nextOffSet) / parseInt(filesize)) / 100);
411
+
412
+ this.progressFlag = true;
413
+ this.loadProgress = Progress;
414
+
415
+ if (res.content.finished == 1) {
416
+ this.loadProgress = 100;
417
+ this.progressFlag = false;
418
+ this.file.mediaUrl = res.content.media.mediaUrl;
419
+ this.file.savedFileName = res.content.media.savedFileName;
420
+ this.file.mediaDate = res.content.media.mediaDate;
421
+ this.$emit('handleEditPhoto', this.file);
422
+ }
423
+ return true;
424
+ }
425
+ },
426
+ S4() {
427
+ return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
428
+ },
429
+ uploadguid() {
430
+ return (this.S4() + this.S4() + '-' + this.S4() + '-' + this.S4() + '-' + this.S4() + '-' + this.S4() + this.S4() + this.S4());
431
+ },
432
+ convertBase64UrlToFile(urlData, filename) {
433
+ const bytes = window.atob(urlData.split(',')[1]); // 去掉url的头,并转换为byte // 处理异常,将ascii码小于0的转换为大于0
434
+ const ab = new ArrayBuffer(bytes.length);
435
+ const ia = new Uint8Array(ab);
436
+ for (let i = 0; i < bytes.length; i++) {
437
+ ia[i] = bytes.charCodeAt(i);
438
+ }
439
+ return new File([ab], filename, { type: 'image/' + this.file.fileExtension });
440
+ },
441
+ gaussBlur(imgData) {
442
+ var pixes = imgData.data;
443
+ var width = imgData.width;
444
+ var height = imgData.height;
445
+ var gaussMatrix = [],
446
+ gaussSum = 0,
447
+ x, y,
448
+ r, g, b, a,
449
+ i, j, k, len;
450
+ var radius = Math.floor(this.imgObj.width / 100);
451
+ if (radius < 10) {
452
+ radius = 10;
453
+ }
454
+ var sigma = Math.floor(radius / 3);
455
+
456
+ a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
457
+ b = -1 / (2 * sigma * sigma);
458
+ //生成高斯矩阵
459
+ for (i = 0, x = -radius; x <= radius; x++, i++) {
460
+ g = a * Math.exp(b * x * x);
461
+ gaussMatrix[i] = g;
462
+ gaussSum += g;
463
+
464
+ }
465
+
466
+ //归一化, 保证高斯矩阵的值在[0,1]之间
467
+ for (i = 0, len = gaussMatrix.length; i < len; i++) {
468
+ gaussMatrix[i] /= gaussSum;
469
+ }
470
+ //x 方向一维高斯运算
471
+ for (y = 0; y < height; y++) {
472
+ for (x = 0; x < width; x++) {
473
+ r = g = b = a = 0;
474
+ gaussSum = 0;
475
+ for (j = -radius; j <= radius; j++) {
476
+ k = x + j;
477
+ if (k >= 0 && k < width) {//确保 k 没超出 x 的范围
478
+ //r,g,b,a 四个一组
479
+ i = (y * width + k) * 4;
480
+ r += pixes[i] * gaussMatrix[j + radius];
481
+ g += pixes[i + 1] * gaussMatrix[j + radius];
482
+ b += pixes[i + 2] * gaussMatrix[j + radius];
483
+ // a += pixes[i + 3] * gaussMatrix[j];
484
+ gaussSum += gaussMatrix[j + radius];
485
+ }
486
+ }
487
+ i = (y * width + x) * 4;
488
+ // 除以 gaussSum 是为了消除处于边缘的像素, 高斯运算不足的问题
489
+ pixes[i] = r / gaussSum;
490
+ pixes[i + 1] = g / gaussSum;
491
+ pixes[i + 2] = b / gaussSum;
492
+ // pixes[i + 3] = a ;
493
+ }
494
+ }
495
+ //y 方向一维高斯运算
496
+ for (x = 0; x < width; x++) {
497
+ for (y = 0; y < height; y++) {
498
+ r = g = b = a = 0;
499
+ gaussSum = 0;
500
+ for (j = -radius; j <= radius; j++) {
501
+ k = y + j;
502
+ if (k >= 0 && k < height) {//确保 k 没超出 y 的范围
503
+ i = (k * width + x) * 4;
504
+ r += pixes[i] * gaussMatrix[j + radius];
505
+ g += pixes[i + 1] * gaussMatrix[j + radius];
506
+ b += pixes[i + 2] * gaussMatrix[j + radius];
507
+ // a += pixes[i + 3] * gaussMatrix[j];
508
+ gaussSum += gaussMatrix[j + radius];
509
+ }
510
+ }
511
+ i = (y * width + x) * 4;
512
+ pixes[i] = r / gaussSum;
513
+ pixes[i + 1] = g / gaussSum;
514
+ pixes[i + 2] = b / gaussSum;
515
+ }
516
+ }
517
+ return imgData;
518
+ },
519
+ }
520
+ };
521
+ </script>
522
+ <style>
523
+ .magnify-stage {
524
+ position: absolute;
525
+ left: 0;
526
+ right: 0;
527
+ bottom: 0;
528
+ top: 50px;
529
+ border: none;
530
+ overflow: hidden;
531
+ }
532
+
533
+ .magnify-footer {
534
+ height: 50px;
535
+ bottom: 0;
536
+ position: absolute;
537
+ width: 100%;
538
+ text-align: center;
539
+ color: #fff;
540
+ z-index: 9;
541
+ }
542
+ .magnify-cropper {
543
+ height: 50px;
544
+ bottom: 0;
545
+ position: absolute;
546
+ width: 100%;
547
+ text-align: center;
548
+ color: #fff;
549
+ z-index: 9;
550
+ }
551
+ .magnify-Original {
552
+ height: 50px;
553
+ top: 50px;
554
+ right:20px;
555
+ position: absolute;
556
+ color: #fff;
557
+ z-index: 9;
558
+ }
559
+ .magnify-toolbar {
560
+ display: inline-block;
561
+ height: 50px;
562
+ background-color: rgba(0, 0, 0, .5);
563
+ -webkit-border-radius: 5px 5px 0 0;
564
+ -moz-border-radius: 5px 5px 0 0;
565
+ border-radius: 5px 5px 0 0;
566
+ }
567
+
568
+ .magnify-toolbar .magnify-btn {
569
+ display: inline-block;
570
+ width: 50px;
571
+ height: 50px;
572
+ margin: 0;
573
+ color: #999;
574
+ line-height: 50px;
575
+ color: #ffffff;
576
+ font-size: 24px;
577
+ cursor: pointer;
578
+ }
579
+ .rc-cropper {
580
+ position: relative;
581
+ }
582
+
583
+ .rc-cropper__iconCrop1 {
584
+ position: absolute;
585
+ right: 4%;
586
+ top: 0%;
587
+ }
588
+ .mask {
589
+ position: fixed;
590
+ z-index: 9998;
591
+ top: 0;
592
+ right: 0;
593
+ bottom: 0;
594
+ left: 0;
595
+ background-color: rgba(0, 0, 0, .3);
596
+ }
597
+ .stream-total-tips {
598
+ position: fixed;
599
+ top: 40%;
600
+ left: 40%;
601
+ z-index: 9999;
602
+ }
603
+
604
+ </style>