给图片添加自定义水印并下载
< template>
< div class = "wrap" >
< div class = "optea" >
< div class = "file-upload" >
< p> 选择图片< / p>
< el- button type= "text" style= "color: #c00;"
> < label for = "uploads" >
< i class = "el-icon-upload2" style= "margin-right: 5px;" > < / i>
选择需要添加水印的图片< / label
> < / el- button
>
< input
type= "file"
id= "uploads"
hidden
accept= "image/png, image/jpeg, image/gif, image/jpg"
@change= "uploadImg($event, 1)"
/ >
< / div>
< p> 水印文字< / p>
< el- input
v- model= "watermarkOptions.text"
placeholder= "请输入水印内容"
> < / el- input>
< p> 字体颜色< / p>
< el- color- picker v- model= "watermarkOptions.color" > < / el- color- picker>
< p> 旋转角度< / p>
< el- slider
v- model= "watermarkOptions.rotate"
: min= "0"
: max= "360"
> < / el- slider>
< p> 透明度< / p>
< el- slider
v- model= "watermarkOptions.alpha"
: min= "0"
: max= "100"
> < / el- slider>
< p> 文本间距< / p>
< el- slider
v- model= "watermarkOptions.width"
: min= "0"
: max= "100"
> < / el- slider>
< p> 字体大小< / p>
< el- slider
v- model= "watermarkOptions.fontSize"
: min= "0"
: step= "0.5"
: max= "50"
> < / el- slider>
< / div>
< div>
< el- button
@click= "handleDown"
class = "download-btn"
type= "primary"
plain
icon= "el-icon-download"
> 下载水印图片< / el- button
>
< div class = "preview" ref= "previewImg" >
< img : src= "preImg || defaultimg" alt= "" / >
< div class = "watermark" : style= "{ background: paint }" > < / div>
< / div>
< / div>
< / div>
< / template>
< script>
import defaultimg from "@/assets/img/headPortrait.jpg" ;
import DomToImage from "dom-to-image" ;
export default {
data ( ) {
return {
defaultimg,
preImg : "" ,
watermarkOptions : {
text : "仅供 xxx 验证使用" ,
fontSize : 10 ,
width : 5 ,
color : "#000000" ,
alpha : 35 ,
rotate : 35
}
} ;
} ,
methods : {
uploadImg ( e, num ) {
var file = e. target. files[ 0 ] ;
if ( ! / \.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$ / . test ( e. target. value) ) {
alert ( "图片类型必须是.gif,jpeg,jpg,png,bmp中的一种" ) ;
return false ;
}
var reader = new FileReader ( ) ;
reader. onload = e => {
let data;
if ( typeof e. target. result === "object" ) {
data = window. URL . createObjectURL ( new Blob ( [ e. target. result] ) ) ;
} else {
data = e. target. result;
}
if ( num === 1 ) {
this . preImg = data;
}
} ;
reader. readAsDataURL ( file) ;
} ,
handleDown ( ) {
let node = this . $refs. previewImg;
let that = this ;
DomToImage. toPng ( node)
. then ( function ( dataUrl ) {
var oLink = document. createElement ( "a" ) ;
oLink. download = "水印图片.png" ;
oLink. href = dataUrl;
oLink. click ( ) ;
that. $nextTick ( ( ) => {
that. $message. success ( "水印图片下载成功" ) ;
} ) ;
} )
. catch ( function ( error ) {
console. error ( "oops, something went wrong!" , error) ;
that. $message. error ( "下载失败" ) ;
} ) ;
}
} ,
computed : {
paint ( ) {
const wordWidth =
this . watermarkOptions. fontSize *
this . watermarkOptions. text. split ( "" ) . length;
const width = wordWidth + this . watermarkOptions. width;
let svgText = `
<svg xmlns="http://www.w3.org/2000/svg" width=" ${ width} px" height=" ${ width} px">
<text x="50%" y="50%"
alignment-baseline="middle"
text-anchor="middle"
stroke=" ${ this . watermarkOptions. color} "
opacity=" ${ this . watermarkOptions. alpha / 100 } "
transform="translate( ${ width / 2 } , ${ width / 2 } ) rotate( ${
this . watermarkOptions. rotate
} ) translate(- ${ width / 2 } , - ${ width / 2 } )"
font-weight="100"
font-size=" ${ this . watermarkOptions. fontSize} "
font-family="microsoft yahe"
>
${ this . watermarkOptions. text}
</text>
</svg> ` ;
return ` url(data:image/svg+xml;base64, ${ btoa (
unescape ( encodeURIComponent ( svgText) )
) } ) ` ;
}
}
} ;
< / script>
< style lang= "scss" scoped>
. wrap {
padding : 10px 20px;
display : flex;
justify- content: flex- start;
align- items: center;
p {
margin : 5px 0 ;
margin- bottom: 10px;
font- weight: 600 ;
}
. download- btn {
margin : 0 15px 15px;
}
. optea {
width : 500px;
}
. preview {
position : relative;
margin- left: 20px;
min- width: 750px;
img {
width : 100 % ;
height : 100 % ;
}
. watermark {
position : absolute;
left : 0 ;
top : 0 ;
width : 100 % ;
height : 100 % ;
}
}
}
< / style>