Most of what you have seen are regular screenshots, which can cope with most application scenarios. However, for image processing, if you want to hand over the rules to users, ordinary screenshots can no longer satisfy users. Then can we implement arbitrary regular capture of images on the front end? Let me discuss it together! Image capture through svgUse the clipPath image tag in svg to capture images through id mapping and the coordinates of the dynamic position polygon <div> <div class="content" @mousemove="mousemove" @mouseup="(e) => {mouseup(e);}"> <!-- Canvas display --> <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> <!-- Drag point --> <ul class="interception"> <li v-for="item in 4" :ref="`li${item}`" :key="item" @mousedown="(e) => {mousedown(e, item);}" ></li> </ul> <!-- Base map display --> <img class="blackImge" src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3228549874,2173006364&fm=26&gp=0.jpg" alt="" /> <!-- Mask layer--> <div class="blackDiv"></div> </div> </div> CSS part<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 .blackImage 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> export default { name: 'Canvas', data() { return { points: '0 0,300 0,300 300,0 300', // Image display initialization status: false, index: 0, disX: 0, disY: 0, coordinates: { // Initialize drag point 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: { //Mouse down 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; }, // Mouse up mouseup(e) { this.status = false; }, //Mouse movement 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(' '); } }, }, }; Effect picture display Source code addressGitHub address --> github.com/lgxin/captu… The above is the detailed content of Vue's implementation of irregular screenshots. For more information about Vue's irregular screenshots, please pay attention to other related articles on 123WORDPRESS.COM! You may also be interested in:
|
<<: Detailed explanation of the role of static variables in MySQL
>>: Linux editing start, stop and restart springboot jar package script example
introduction: Slider drag verification is now use...
Preface Execute the show create table <tablena...
Pull the image: [mall@VM_0_7_centos ~]$ sudo dock...
Table of contents Make scrolling smoother BetterS...
1. Download the software 1. Go to the MySQL offic...
By using Nginx virtual domain name configuration,...
This article mainly introduces an example of Vue ...
This article shares the installation tutorial of ...
Table of contents 1. props/$emit Introduction Cod...
When using MySQL, dates are generally stored in f...
1. Create a MySQL database 1. Create database syn...
This article example shares the specific code of ...
1. Understanding of transition attributes 1. The ...
JavaScript scripts can be embedded anywhere in HT...
Due to the needs of the project, I plan to study ...