基于canvas实现图片文字水印生成器

介绍

在前端开发中时常会遇到需要给图片加上水印的功能,就像在创作csdn的文章时上传的图片都会打上传作者的水印,我们来探讨一下这个水印是如何生成的。

 首先生成的文字水印大概可以控制该文字的颜色、字体大小、以及水印的位置等

1.静态页面结构

我们就简单的搭一个水印生成器的静态页面

<!DOCTYPE html>
<html>

<head>
  <title>图片水印生成器</title>
  <style>
    .container {
      display: flex;
      flex-direction: column;
      align-items: center;
    }

    #watermark {
      position: relative;
    }

    #downloadBtn {
      margin-top: 10px;
      padding: 5px 10px;
      background-color: #4CAF50;
      color: white;
      border: none;
      cursor: pointer;
      display: none;
    }
  </style>
</head>

<body>
  <div class="container">
    <h2>图片水印生成器</h2>
    <input type="file" id="fileInput">
    <br>
    <label for="text">水印文字:</label>
    <input type="text" id="text">
    <br>
    <label for="size">文字大小:</label>
    <input type="number" id="size">
    <br>
    <label for="color">文字颜色:</label>
    <input type="color" id="color">
    <br>
    <label for="position">水印位置:</label>
    <select id="position">
      <option value="top-left">左上角</option>
      <option value="top-right">右上角</option>
      <option value="bottom-left">左下角</option>
      <option value="bottom-right">右下角</option>
      <option value="center">居中</option>
    </select>
    <br>
    <button id="generateBtn">生成水印</button>
    <a href="#" id="downloadBtn" download="watermarked_image.png">下载水印图片</a>
    <br>
    <img id="watermark" src="" alt="水印图片">
  </div>
</body>

</html>

静态页面大概是这个样子

接下来就是js代码

2.给生成水印按钮绑定点击事件

 首先要获取到生成水印的按钮给他绑定一个点击事件

  document.getElementById('generateBtn').addEventListener('click', generateWatermark);
    //点击后调用此函数生成水印

3.生成水印的函数

首先要获取到需要用到的值的dom

 const obj = {
        text: document.getElementById('text').value,
        size: document.getElementById('size').value,
        color: document.getElementById('color').value,
        position: document.getElementById('position').value
      }

读取用户上传的图片的文件

const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
const reader = new FileReader(); //获取一个FileReader对象,用于读取上传的图片文件。

绑定文件读取完后的触发的事件

reader.onload = (event) => { //当文件读取完成后触发
        const img = new Image(); //创建一个Image对象,用于加载上传的图片文件
        img.onload = () => { //当图片加载完成后触发
        const canvas = document.createElement('canvas');
        const ctx = canvas.getContext('2d');
        canvas.width = img.width; //canvas画布的width和height就是图片的宽和高
        canvas.height = img.height;
        ctx.drawImage(img, 0, 0); //将上传的图片绘制到canvas上
        }
    };

这里就是利用canvas画布来构造,将画布的宽和高就设置为图片的大小,在将图片贴到canvas画布上

 接下来就是设置文字的大小、颜色、位置了

          ctx.font = obj.size + 'px Arial'; //设置canvas上文字的字体大小和颜色
          ctx.fillStyle = obj.color;
          console.log(obj.position);
          switch (obj.position) {
            case 'top-left':
              ctx.fillText(obj.text, 10, 30)
              break
            case 'top-right':
              ctx.fillText(obj.text, canvas.width - 10 - ctx.measureText(obj.text).width, 30)
              break
            case 'bottom-left':
              ctx.fillText(obj.text, 10, canvas.height - 10)
              break
            case 'bottom-right':
              ctx.fillText(obj.text, canvas.width - 10 - ctx.measureText(obj.text).width, canvas.height - 10)
              break
            case 'center':
              const textWidth = ctx.measureText(obj.text).width
              const textHeight = 20 // Assuming font size is 20px
              const centerX = (canvas.width - textWidth) / 2
              const centerY = (canvas.height + textHeight) / 2
              ctx.fillText(obj.text, centerX, centerY)
              break
          }

我的文字位置就设置了四个角落以及中间,这个位置可以根据实际情况决定

文字的位置计算方法也是用了ctx.measureText()

关键代码是将文字贴到图片上

ctx.fillText(obj.text, centerX, centerY)

最后就是将最开始的img标签改变它的src属性,让其显示出来,以及提供下载按钮显示

const watermarkedImage = new Image();
          //将canvas转换为DataURL,以便稍后使用。
          watermarkedImage.src = canvas.toDataURL();
          //将水印图片的src属性设置为canvas转换后的DataURL
          document.getElementById('watermark').src = watermarkedImage.src;
          //将下载按钮的display属性设置为'inline-block',以便在canvas下方显示用于下载图片
          document.getElementById('downloadBtn').href = watermarkedImage.src;
          document.getElementById('downloadBtn').style.display = 'inline-block';
        };
        img.src = event.target.result;
      };
      reader.readAsDataURL(file);

现在就可以上传图片生成水印了

也可以提供下载功能

4.完整代码

<!DOCTYPE html>
<html>

<head>
  <title>图片水印生成器</title>
  <style>
    .container {
      display: flex;
      flex-direction: column;
      align-items: center;
    }

    #watermark {
      position: relative;
    }

    li {
      list-style: none;
    }


    #downloadBtn {
      margin-top: 10px;
      padding: 5px 10px;
      background-color: #4CAF50;
      color: white;
      border: none;
      cursor: pointer;
      display: none;
    }
  </style>
</head>

<body>
  <div class="container">
    <h2>图片水印生成器</h2>
    <input type="file" id="fileInput">
    <br>
    <label for="text">水印文字:</label>
    <input type="text" id="text">
    <br>
    <label for="size">文字大小:</label>
    <input type="number" id="size">
    <br>
    <label for="color">文字颜色:</label>
    <input type="color" id="color">
    <br>
    <label for="position">水印位置:</label>
    <select id="position">
      <option value="top-left">左上角</option>
      <option value="top-right">右上角</option>
      <option value="bottom-left">左下角</option>
      <option value="bottom-right">右下角</option>
      <option value="center">居中</option>
    </select>
    <br>
    <button id="generateBtn">生成水印</button>
    <a href="#" id="downloadBtn" download="watermarked_image.png">下载水印图片</a>
    <br>
    <img id="watermark" src="" alt="水印图片">
  </div>

  <script>
    document.getElementById('generateBtn').addEventListener('click', generateWatermark);
    //点击后调用此函数生成水印

    function generateWatermark() {
      //获取到input框中的一些值
      const obj = {
        text: document.getElementById('text').value,
        size: document.getElementById('size').value,
        color: document.getElementById('color').value,
        position: document.getElementById('position').value
      }
      const fileInput = document.getElementById('fileInput');
      const file = fileInput.files[0];
      const reader = new FileReader(); //获取一个FileReader对象,用于读取上传的图片文件。

      reader.onload = (event) => { //当文件读取完成后触发
        const img = new Image(); //创建一个Image对象,用于加载上传的图片文件
        img.onload = () => { //当图片加载完成后触发
          const canvas = document.createElement('canvas');
          const ctx = canvas.getContext('2d');
          canvas.width = img.width; //canvas画布的width和height就是图片的宽和高
          canvas.height = img.height;
          ctx.drawImage(img, 0, 0); //将上传的图片绘制到canvas上

          ctx.font = obj.size + 'px Arial'; //设置canvas上文字的字体大小和颜色
          ctx.fillStyle = obj.color;
          console.log(obj.position);
          switch (obj.position) {
            case 'top-left':
              ctx.fillText(obj.text, 10, 30)
              break
            case 'top-right':
              ctx.fillText(obj.text, canvas.width - 10 - ctx.measureText(obj.text).width, 30)
              break
            case 'bottom-left':
              ctx.fillText(obj.text, 10, canvas.height - 10)
              break
            case 'bottom-right':
              ctx.fillText(obj.text, canvas.width - 10 - ctx.measureText(obj.text).width, canvas.height - 10)
              break
            case 'center':
              const textWidth = ctx.measureText(obj.text).width
              const textHeight = 20 // Assuming font size is 20px
              const centerX = (canvas.width - textWidth) / 2
              const centerY = (canvas.height + textHeight) / 2
              ctx.fillText(obj.text, centerX, centerY)
              break
          }
          // ctx.fillText(obj.text, 30, 30);

          const watermarkedImage = new Image();
          //将canvas转换为DataURL,以便稍后使用。
          watermarkedImage.src = canvas.toDataURL();
          //将水印图片的src属性设置为canvas转换后的DataURL
          document.getElementById('watermark').src = watermarkedImage.src;
          //将下载按钮的display属性设置为'inline-block',以便在canvas下方显示用于下载图片
          document.getElementById('downloadBtn').href = watermarkedImage.src;
          document.getElementById('downloadBtn').style.display = 'inline-block';
        };
        img.src = event.target.result;
      };
      reader.readAsDataURL(file);
    }
  </script>
</body>

</html>

总结

主要的核心逻辑其实也很简单,就是使用canvas画布将图片贴到画布上,然后设置文字水印的颜色,字体大小等属性,将其贴到canvas画布对应的位置上,最后改变原来的img的src属性进行展示水印图片。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lee哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值