使用canvas在前端添加水印

自闭症网瘾萝莉.ら 提交于 2020-02-27 14:28:17
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <style>
    * {
      box-sizing: border-box;
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
    }
    body,
    html {
      position: relative;
      width: 100%;
      height: 100vh;
      margin: 0;
      padding: 0;
      font: 12px/1.5 Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif;
    }
    input[type='text'] {
      width: 100%;
      height: 24px;
      /*-webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);*/
      /*box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);*/
      /*border-radius: 0.14285714rem;*/
      /*border: 1px solid rgba(34, 36, 38, 0.15);*/
    }
    .wrap {
      padding-top: 36px;
      width: 800px;
      margin: 0 auto;
      padding-bottom: 120px;
    }
    .wrap:after {
      content: " ";
      display: block;
      height: 0;
      clear: both;
      visibility: hidden;
    }
    .temp {
      float: right;
      width: 360px;
    }
    .diy {
      float: left;
      font-size: 0;
      position: relative;
    }
    .diy img {
      width: 360px;
      max-width: 100%;
    }
  </style>
</head>
<body>
<div class="wrap">
  <div class="temp">
    <input type="file" style="cursor: pointer;" id="file" onchange="createImg(this)" accept="image/*" />
    <div style="height: 10px;"></div>
    <input type="text" id="markTxt" value="请输入水印文字" />
    <div style="height: 10px;"></div>
    <label>字体大小:<input type="number" value="12" id="size"/></label>
    <div style="height: 10px;"></div>
    <label>
      字体样式:
      <select id="fStyle">
        <option selected value="normal">normal</option>
        <option value="italic">italic</option>
        <option value="oblique">oblique</option>
      </select>
    </label>
    <label>
      字体粗细:
      <select id="fWeight">
        <option value="100">100</option>
        <option value="200">200</option>
        <option value="300">300</option>
        <option selected value="400">400</option>
        <option value="500">500</option>
        <option value="600">600</option>
        <option value="700">700</option>
        <option value="800">800</option>
        <option value="900">900</option>
      </select>
    </label>
    <label>字体颜色:<input type="color" id="color"/></label>
    <div style="height: 10px;"></div>
    <button type="button" style="cursor: pointer;" onclick="createItem()">生成水印图片</button>
    <button type="button" style="cursor: pointer;margin-left: 36px;" onclick="dowload()">下载水印图片</button>
  </div>
  <div class="diy">
    <img src="images/pic.jpg" alt="" />
  </div>
</div>
<input type="hidden" id="cur" value="100,100" />
<script type="text/javascript">
  var flag = false;
  var flagImg = false;
  var imgData = null;
  function createItem() {
    var canvas = document.querySelector("#canvas");
    if (flag) {
      var markTxt = document.querySelector("#markTxt").value;
      var markSize = document.querySelector("#size").value;
      var markWeight = document.querySelector("#fWeight").value;
      var markStyle = document.querySelector("#fStyle").value;
      var color = document.querySelector("#color").value;
      var context = canvas.getContext("2d");
      if (flagImg) {
        imgData = context.getImageData(0, 0, canvas.width, canvas.height);
        flagImg = false;
      }
      context.clearRect(0, 0, canvas.width, canvas.height);
      context.putImageData(imgData, 0, 0, 0, 0, canvas.width, canvas.height);
      context.font = markStyle + " " + markWeight + " " + markSize + "px arial";
      context.fillStyle = color;
      // context.fillText(markTxt, canvas.width / 2, canvas.height - 12);
      var cur = document.querySelector("#cur").value;
      var mark = document.querySelector(".mark");
      if (mark) {
        mark.parentNode.removeChild(mark);
      }
      context.fillText(markTxt, cur.split(",")[0], cur.split(",")[1] + markSize);
    } else {
      alert("请上传图片");
    }
  }

  function createImg(et) {
    console.log(et);
    var file = et.files[0];
    var url = URL.createObjectURL(file);
    flag = true;
    flagImg = true;
    init(url);
  }
  function init(url) {
    var img = new Image();
    // 解决跨域 Canvas 污染问题
    // img.setAttribute("crossOrigin", "anonymous");
    img.onload = function() {
      var canvas = document.createElement("canvas");
      canvas.id = "canvas";
      if (flag) {
        canvas.style.cursor = "crosshair";
        canvas.setAttribute("onclick", "cnvs_getCoordinates()");
      }
      if (img.width >= 360) {
        canvas.width = 360;
        canvas.height = (img.height * 360) / img.width;
      } else {
        canvas.width = img.width;
        canvas.height = img.height;
      }
      console.log(canvas);
      var ctx = canvas.getContext("2d");
      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
      if (url == "https://www.hnxaca.com/common/images/pic.jpg") {
        ctx.font = "italic bold 20px arial";
        ctx.fillStyle = "#f00";
        var cur = document.querySelector("#cur").value;
        ctx.fillText("这是一张水印图片", cur.split(",")[0], cur.split(",")[1]);
      }
      // ctx.drawImage(img, 0, 0);
      document.querySelector(".diy").innerHTML = "";
      document.querySelector(".diy").appendChild(canvas);
    };
    img.onerror = function(et) {
      throw new Error(et);
    };
    img.src = url;
  }
  init("https://www.hnxaca.com/common/images/pic.jpg");
  function dowload() {
    if (flag) {
      var canvas = document.querySelector("#canvas");
      var url = canvas.toDataURL(); //得到图片的base64编码数据
      var a = document.createElement("a"); // 生成一个a元素
      var event = new MouseEvent("click"); // 创建一个单击事件
      a.download = name || "photo"; // 设置图片名称
      a.href = url; // 将生成的URL设置为a.href属性
      a.dispatchEvent(event); // 触发a的单击事件
    } else {
      alert("请在图片上右击,选择'图片另存为'");
    }
  }
  function cnvs_getCoordinates(event) {
    var et = event || window.event;
    console.log(et.offsetX, et.offsetY);
    var x = et.offsetX;
    var y = et.offsetY;
    document.querySelector("#cur").value = x + "," + y;
    var markTxt = document.querySelector("#markTxt").value;
    var markSize = document.querySelector("#size").value;
    var markWeight = document.querySelector("#fWeight").value;
    var markStyle = document.querySelector("#fStyle").value;
    var color = document.querySelector("#color").value;

    var div = document.querySelector(".mark");
    if (!div) {
      div = document.createElement("div");
      div.setAttribute("class", "mark");
      div.style.position = "absolute";
    }
    // div.innerHTML = "Coordinates: (" + et.offsetX + "," + et.offsetY + ")";
    div.innerHTML = markTxt;

    // object.style.font="italic small-caps bold 12px arial,sans-serif"
    div.style.font = markStyle + " " + markWeight + " " + markSize + "px arial";
    div.style.color = color;

    div.style.left = et.offsetX + "px";
    div.style.top = et.offsetY + "px";

    if (!document.querySelector(".mark")) {
      document.querySelector(".diy").append(div);
    }
  }
</script>
</body>
</html>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!