大家所见到的大多数都是有规则截图,可以应付大部分的应用场景,但是对于图片处理,想要将规则交给用户,普通的截图已经满足不了用户了,那我们能不能前端实现图片的任意规则截取,接下来让我一起探讨一下吧!
通过 svg 实现 图片截取
使用svg中clipPath image标签 通过id 映射, 动态位置polygon的坐标,实现图片的截取
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
|
< div >
< div class = "content" @ mousemove = "mousemove" @mouseup="(e) => {mouseup(e);}">
<!-- 画布展示 -->
< svg
ref = "blackSvg"
class = "blackSvg"
xmlns = "http://www.w3.org/2000/svg"
width = "300"
height = "300"
>
< defs >
< clipPath id = "clippath" >
< polygon :points = "points" ></ polygon >
</ clipPath >
</ defs >
< image
xmlns:link = "http://www.w3.org/1999/xlink"
href = "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3228549874,2173006364&fm=26&gp=0.jpg" rel = "external nofollow"
width = "300"
height = "300"
preserveAspectRatio = "none"
style = "clip-path: url(#clippath)"
></ image >
</ svg >
<!-- 拖拽点 -->
< ul class = "interception" >
< li
v-for = "item in 4"
:ref = "`li${item}`"
:key = "item"
@mousedown="(e) => {mousedown(e, item);}"
></ li >
</ ul >
<!-- 底图展示 -->
< img
class = "blackImge"
src = "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3228549874,2173006364&fm=26&gp=0.jpg"
alt = ""
/>
<!-- 遮罩层 -->
< div class = "blackDiv" ></ div >
</ div >
</ div >
|
css部分
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
|
<style lang= "sass" >
.blackDiv
width : 100%
height : 100%
position : absolute
top : 0
z-index : 2
background : rgba( 0 , 0 , 0 , 1 )
.content
width : 300px
height : 300px
text-align : left
position : relative
.blackSvg
position : absolute
top : 0
z-index : 3
.blackImge
position : absolute
top : 0
left : 0
width : 300px
height : 300px
.interception
list-style : none
position : absolute
top : 0
margin : 0
padding : 0
z-index : 3
>li
position : absolute
width : 10px
height : 10px
background : blue
border-radius: 50%
cursor : pointer
&:hover
transform: scale( 1.2 )
transition-duration: . 2
>li:nth-child( 1 )
top : 10px
left : 10px
>li:nth-child( 2 )
top : 10px
left : 100px
>li:nth-child( 3 )
top : 100px
left : 100px
>li:nth-child( 4 )
top : 100px
left : 10px
</style>
<script>
|
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
|
export default {
name: 'Canvas' ,
data() {
return {
points: '0 0,300 0,300 300,0 300' , // 图片展示初始化
status: false ,
index: 0,
disX: 0,
disY: 0,
coordinates: { // 初始化拖拽点
1: [0, 0],
2: [300, 0],
3: [300, 300],
4: [0, 300],
},
};
},
mounted() {
this .$nextTick(() => {
for (let key in this .coordinates) {
const left = this .coordinates[key][0];
const top = this .coordinates[key][1];
this .$refs[`li${key}`].style.left = `${left}px`;
this .$refs[`li${key}`].style.top = `${top}px`;
if (key == 2 || key == 3) {
this .$refs[`li${key}`].style.left = `${left - 10}px`;
}
if (key == 3 || key == 4) {
this .$refs[`li${key}`].style.top = `${top - 10}px`;
}
}
document.onmouseup = () => {
this .status = false ;
};
});
},
methods: {
//鼠标按下
mousedown(e, index) {
this .status = true ;
this .index = index;
this .disX = e.clientX - this .$refs[`li${index}`].offsetLeft;
this .disY = e.clientY - this .$refs[`li${index}`].offsetTop;
},
// 鼠标抬起
mouseup(e) {
this .status = false ;
},
// 鼠标移动
mousemove(e) {
if ( this .status) {
let left = e.clientX - this .disX;
let top = e.clientY - this .disY;
this .$refs[`li${ this .index}`].style.left = `${left}px`;
this .$refs[`li${ this .index}`].style.top = `${top}px`;
this .coordinates[ this .index] = [left, top];
const pointsArr = [];
for (let item in this .coordinates) {
pointsArr.push(
Array.from( this .coordinates[item], (e) => {
return e + 5;
})
);
}
this .points = pointsArr.join( ' ' );
}
},
},
};
|
效果图展示
源码地址
github地址--> github.com/lgxin/captu…
以上就是vue 实现无规则截图的详细内容,更多关于vue 无规则截图的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/6950478072906776589