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
background Recently, a leader wanted us to build ...
Let's take a look at the code first <form ...
As the title says, otherwise when the page is revi...
Table of contents Concurrent scenarios Write-Writ...
Intro Previously, our docker images were stored i...
Why do we need to summarize the browser compatibi...
Adobe Brackets is an open source, simple and powe...
RPM package management A packaging and installati...
tcpdump is a flexible and powerful packet capture...
Table of contents 1. What is an event? 2. How to ...
This article shares the specific code of JavaScri...
This article example shares the specific code of ...
Deploy the project to the project site test envir...
Table of contents How to start mysqld Method 1: m...
Table of contents Mistake 1: Too many columns of ...