给图片添加自定义水印并下载  
 
< 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>