canvas离屏技术与放大镜实现代码示例

HTML教程 2025-08-06

利用canvas除了可以实现滤镜,还可以利用离屏技术放大镜功能。

为了方便讲解,本文分为 2 个应用部分:

  • 实现水印和中心缩放

  • 实现放大镜

1. 什么是离屏技术?

canvas 学习和滤镜实现介绍过drawImage接口。除了绘制图像,这个接口还可以:将一个canvas对象绘制到另一个canvas对象上。这就是离屏技术。

2. 实现水印和中心缩放

在代码中,有两个 canvas 标签。分别是可见与不可见。 不可见的 canvas 对象上的 Context 对象,就是我们放置图像水印的地方。

更多详解,请看代码注释:

    Learn Canvas                  
      window.onload = function () {      var canvas = document.querySelector("#my-canvas")      var watermarkCanvas = document.querySelector("#watermark-canvas")      var slider = document.querySelector("input")      var scale = slider.value      var ctx = canvas.getContext('2d')      var watermarkCtx = watermarkCanvas.getContext("2d")      /* 给第二个canvas获取的Context对象添加水印 */      watermarkCanvas.width = 300      watermarkCanvas.height = 100      watermarkCtx.font = "bold 20px Arial"      watermarkCtx.lineWidth = "1"      watermarkCtx.fillStyle = "rgba(255 , 255 , 255, 0.5)"      watermarkCtx.fillText("=== yuanxin.me ===", 50, 50)      /****************************************/      var img = new Image()      img.src = "./img/photo.jpg"      /* 加载图片后执行操作 */      img.onload = function () {        canvas.width = img.width;        canvas.height = img.height;        drawImageByScale(canvas, ctx, img, scale, watermarkCanvas);        // 监听input标签的mousemove事件        // 注意:mousemove实时监听值的变化,内存消耗较大        slider.onmousemove = function () {          scale = slider.value          drawImageByScale(canvas, ctx, img, scale, watermarkCanvas);        }      }      /******************/    }    /**    *    * @param {Object} canvas 画布对象    * @param {Object} ctx    * @param {Object} img    * @param {Number} scale 缩放比例    * @param {Object} watermark 水印对象    */    function drawImageByScale(canvas, ctx, img, scale, watermark) {      // 图像按照比例进行缩放      var width = img.width * scale,        height = img.height * scale      // (dx, dy): 画布上绘制img的起始坐标      var dx = canvas.width / 2 - width / 2,        dy = canvas.height / 2 - height / 2      ctx.clearRect(0, 0, canvas.width, canvas.height) // No1 清空画布      ctx.drawImage(img, dx, dy, width, height) // No2 重新绘制图像      if (watermark) {        // No3 判断是否有水印: 有, 绘制水印        ctx.drawImage(watermark, canvas.width - watermark.width, canvas.height - watermark.height)      }    }  

实现效果如下图所示:

936e131288c69bedbfd38f1254316a83.png

拖动滑竿,即可放大和缩小图像。然后右键保存图像。保存后的图像,就有已经有了水印,如下图所示:

4e44e1b3185850f7c05e1e21adf60f28.png

3. 实现放大镜

在上述中心缩放的基础上,实现放大镜主需要注意以下 2 个部分:

  • 细化处理canvas的鼠标响应事件:滑入、滑出、点击和松开

  • 重新计算离屏坐标(详细公式计算思路请见代码注释)

  • 重新计算鼠标相对于 canvas 标签的坐标(详细公式计算思路请见代码注释)

代码如下:

    Document        

放大镜效果如下图所示(被红笔标出的区域就是我们的正方形放大镜):

43e5dc5501f85c4a368b888a0ce506bb.jpg

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

注:相关教程知识阅读请移步到HTML教程频道。