<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
隨著搬運工的逐漸增加,原創作者的利益收到了極大的影響.所以給圖片或視訊加上水印顯得極其重要,他可以有效的維護原創作者的版權防止盜版.本文分享一個由canvas和vue.js製作的圖片水印新增器。
自定義水印的文字及顏色,水印的位置,旋轉角度,大小,透明度,是否重複顯示,以及選擇為重複時可以選擇文字之間的水平間距和垂直間距,在設定為合適的圖片時點選下載按鈕即可下載得到完成圖.如果覺得效果不好也可以點選重置按鈕瞬間清屏.同時還支援logo圖水印。
1.首先要引入vue.js以及elementui元件和樣式如下:
<!-- 引入樣式 --> <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css" rel="external nofollow" /> <!-- 引入 Vue --> <script src="https://unpkg.com/vue@next"></script> <!-- 引入元件庫 --> <script src="https://unpkg.com/element-plus"></script>
2.html程式碼如下:
<div id="app"> <div class="home"> <div class="mycontainer"> <canvas id="canvasImg" @click="uploadfile()"></canvas> <div class="selectbox box" v-show="imgnode"> <div style="max-width:330px"> <input type="text" class="canvastext" @input="addtext" v-model="inputval" placeholder="請輸入水印文字"/> 水印顏色:<input type="color" style="margin-right:20px" class="colorselect" placeholder="" v-model="color" @change="loop"> 取色器:<input type="color" class="colorselect"> <ul class="btns"> <li class="smallprant"><button @click="addlogo">上傳水印或logo圖</button></li> <li><button @click="unset">重新設定水印</button></li> </ul> </div> <div class="box"> <ul class="centerselect"> <li>位置 <el-select v-model="position" placeholder="請選擇" @change="loop"> <el-option label="中心" value="中心"></el-option> <el-option label="左上" value="左上"></el-option> <el-option label="上" value="上"></el-option> <el-option label="右上" value="右上"></el-option> <el-option label="右" value="右"></el-option> <el-option label="右下" value="右下"></el-option> <el-option label="下" value="下"></el-option> <el-option label="左下" value="左下"></el-option> <el-option label="左" value="左"></el-option> </el-select> </li> <li class="rotate">旋轉 <el-select v-model="rotate" placeholder="請選擇" @change="loop"> <el-option label="0°" :value="0"></el-option> <el-option label="15°" :value="15"></el-option> <el-option label="30°" :value="30"></el-option> <el-option label="45°" :value="45"></el-option> <el-option label="60°" :value="60"></el-option> </el-select> </li> <li>重複 <el-select v-model="repetition" placeholder="請選擇" @change="loop"> <el-option label="不重複" :value="false"></el-option> <el-option label="重複" :value="true"></el-option> </el-select> </li> </ul> </div> <div class="box"> <span>x間距</span> <div class="block" style="margin:10px 0 0 0;"> <el-slider v-model="value0" :step="1" :max="slidermax" @input="loop"></el-slider> </div> <span>y間距</span> <div class="block" style="margin:10px 0 0 0;"> <el-slider v-model="value1" :step="1" :max="slidermax" @input="loop"></el-slider> </div> <span>大小</span> <div class="block" style="margin:10px 0;"> <el-slider v-model="value2" :step="1" :max="slidermax" @input="loop"></el-slider> </div> <span>透明度</span> <div class="block" style="margin:10px 0;"> <el-slider v-model="value3" :step="0.1" :max='1' @input="loop"></el-slider> </div> </div> </div> <el-button v-show="imgnode" style="margin-top:10px;" @click="saveimg">儲存圖片到本地</el-button> </div> </div> </div>
3.點選按鈕後需要選擇上傳水印的圖片方法如下:
整體思路如下:
loop () { this.clear()//1.清空畫布 if(this.imgnode)this.drawimg(this.imgnode)//2.判斷是否上傳了圖片,有就繪製圖片 if(this.inputval)this.drawtext(this.inputval)//3.判斷輸入框是否有文字,有繪製文字 if(this.logo)this.drawlogo(this.logo)//4.判斷是否新增logo圖片,有就繪製logo },
下面先介紹一下專案中執行到的一些函數方法:
(1)繪製背景函數,先拿到頁面中cavans元素,運用drawImage()畫出背景。
//繪製圖片 drawimg(url){ let canvas = document.getElementById('canvasImg') let context = canvas.getContext('2d') context.drawImage(url, 0, 0) },
(2) 繪製字型水印,同理先拿到canvas元素, 運用到的方法:
通過改變x,y將元素放置在畫布各個位置,繪製logo水印同理。
//繪製字型水印 drawtext(value){ let canvas = document.getElementById('canvasImg') //獲取cavans let context = canvas.getContext('2d') let strarr = this.setposition() context.font = this.value2+"px '宋體'" context.fillStyle = this.color if (!this.repetition) { //是否想要文字重複,預設不重複 context.save() context.globalAlpha = this.value3 context.translate(strarr[0], strarr[1]) context.rotate((Math.PI/180)*(this.rotate*1)) context.translate(-strarr[0], -strarr[1]) context.fillText(value, strarr[0], strarr[1]+this.value2) context.restore() } else { for (let i=0 ; i < canvas.width ; i += (this.value2*this.inputval.length +this.value0)) { for (let j = 0 ; j < canvas.height ; j += (this.value2 + this.value1)) { context.save() context.globalAlpha = this.value3 context.translate(strarr[0]+i, strarr[1]+j) context.rotate((Math.PI/180)*(this.rotate*1)) context.translate(-strarr[0]-i, -strarr[1]-j) context.fillText(value, (strarr[0])+i, (strarr[1])+j+this.value2) context.restore() } } } },
(3)清屏函數:如果在繪製過程中,對繪製的效果不滿意,想要重新繪製,就涉及到清屏操作,這裡我是將輸入的文字(inputval)和選中的水印(logo)設定為空再重新繪製, 程式碼如下:
//重新設定 unset(){ //輸入的文字 this.inputval = null //選中的水印 this.logo = null this.loop() },
(4)儲存圖片程式碼:繪製完成後就是儲存圖片程式碼,這裡我是先建立了一個url元素用來存放下載的位置,檔名用new Date().getTime()+‘.png’ 這種形式來避免檔名重複,當我們下載完成之後建立的url並沒有被釋放,此時就需要使用 URL.revokeObjectURL()方法將記憶體釋放掉,此處做了一個延遲,讓url記憶體5秒後被釋放。
//儲存圖片到本地 saveimg () { let canvas = document.getElementById('canvasImg') canvas.toBlob(blob => { let url = URL.createObjectURL(blob) let save_link = document.createElement('a'); save_link.href = url; save_link.download = new Date().getTime()+'.png'; let event = document.createEvent('MouseEvents'); event.initEvent("click", true, false); save_link.dispatchEvent(event); setTimeout(() => { URL.revokeObjectURL(url) }, 5000); }) },
(5)功能函數:使用這種方法建立元素可以節約資源避免浪費。
//----功能函數---- loadImg (url) { const img = document.createElement('img') img.src = url return img },
css程式碼如下:
*{ margin: 0; padding: 0; } .title{ font-size: 20px; margin: 30px; color:#888; } canvas{ background-color: #ccc; max-width: 960px; } .cavansimg{ width: 230px; height: 50px; background-color: #409EFF; border-radius: 5px; cursor: pointer; } .mycontainer { width: 960px; text-align: center; margin:0 auto; padding-bottom: 20px; } .textstyle{ width: 100%; display: flex; justify-content: space-between; align-items: center; } .selectbox { display: flex; margin-top: 20px; justify-content: space-between; } .box{ width: 100%; display: flex; justify-content: space-between; align-items: center; flex:1; color: #409EFF; } li { list-style: none; } .btns { display: flex; justify-content: space-between; margin-left: 20px; } .btns button { width: 120px; height: 50px; margin-right: 30px; border-radius: 10px; background-color: #409EFF; color: #fff; outline: none; border: none; } .colorselect { border-radius: 5px; width: 80px; height: 40px; outline: none; border: none; } .canvastext { height: 40px; width: 150px; border-radius: 5px; text-indent: 10px; border:1px solid #409EFF; border: none; outline: none; } .centerselect{ margin:20 0; display: flex; justify-content: space-between; color: #409EFF; } .centerselect li { height: 50px; line-height: 50px; } span { display: inline-block; } .smallprant { position: relative; } html,body {user-select: none;} .block { width: 150px; }
初始介面:
點選按鈕選擇圖片後:
上面就是水印製作工具的全部過程了,最終效果跟上面一樣,主要就是運用了canvas的一些屬性。
到此這篇關於Vue+Canvas製作簡易的水印新增器小工具的文章就介紹到這了,更多相關Vue Canvas水印新增器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45