目次
1. 什么是离屏技术?
2. 实现水印和中心缩放
3. 实现放大镜
1 . パディングスクリーンテクノロジーとは何ですか?
2. ウォーターマークと中央スケーリングを実装します
. h3> 上 中央上、拡大鏡の基本ニーズ次の 2 つの部分に注意してください:
ホームページ ウェブフロントエンド H5 チュートリアル キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

Aug 31, 2018 am 11:57 AM
canvas html5 javascript 画像処理 アルゴリズム

この記事では、キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか? 、特定の参考値があり、困っている友人がそれを参照できます。お役に立てば幸いです。

canvas を使用してフィルターを実装するだけでなく、オフスクリーン テクノロジーの虫眼鏡機能も使用できます。 canvas除了可以实现滤镜,还可以利用离屏技术放大镜功能。

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

  1. 实现水印和中心缩放

  2. 实现放大镜

1. 什么是离屏技术?

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

2. 实现水印和中心缩放

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

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

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Learn Canvas</title>
  <style>
    canvas {
      display: block;
      margin: 0 auto;
      border: 1px solid #222;
    }

    input {
      display: block;
      margin: 20px auto;
      width: 800px
    }
  </style>
</head>
<body>
  <div id="app">
    <canvas id="my-canvas"></canvas>
    <input type="range" value="1.0" min="0.5" max="3.0" step="0.1">
    <canvas id="watermark-canvas" style="display: none;"></canvas>
  </div>
  <script type="text/javascript">
    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(&#39;2d&#39;)
      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)
      }
    }
  </script>
</body>
</html>
ログイン後にコピー

实现效果如下图所示:

キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

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

キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

3. 实现放大镜

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

  1. 细化处理canvas説明の便宜上、この記事は 2 つのアプリケーション部分に分かれています:

    1. ウォーターマークと中央スケーリングの実装

    2. 虫眼鏡の実装

    3. 1 . パディングスクリーンテクノロジーとは何ですか?

    キャンバスの学習とフィルターの実装には、drawImage インターフェイスが導入されました。このインターフェイスでは、画像の描画に加えて、次のこともできます。canvas オブジェクトを別の canvas オブジェクトに描画します。これはオフスクリーンテクノロジーです。

    2. ウォーターマークと中央スケーリングを実装します

    コードには 2 つの Canvas タグがあります。それらはそれぞれ目に見えるものと見えないものです。非表示のキャンバス オブジェクト上のコンテキスト オブジェクトは、画像の透かしを配置する場所です。

    詳細については、コードのコメントを参照してください:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>Document</title>
      <style>
        canvas {
          display: block;
          margin: 0 auto;
          border: 1px solid #222;
        }
      </style>
    </head>
    <body>
      <canvas id="my-canvas"></canvas>
      <canvas id="off-canvas" style="display: none;"></canvas>
      <script>
        var isMouseDown = false,
          scale = 1.0
        var canvas = document.querySelector("#my-canvas")
        var offCanvas = document.querySelector("#off-canvas") // 离屏 canvas
        var ctx = canvas.getContext("2d")
        var offCtx = offCanvas.getContext("2d") // 离屏 canvas 的 Context对象
        var img = new Image()
    
        window.onload = function () {
          img.src = "./img/photo.jpg"
    
          img.onload = function () {
            canvas.width = img.width
            canvas.height = img.height
    
            offCanvas.width = img.width
            offCanvas.height = img.height
    
            // 计算缩放比例
            scale = offCanvas.width / canvas.width
    
            // 初识状态下, 两个canvas均绘制Image
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
            offCtx.drawImage(img, 0, 0, canvas.width, canvas.height)
    
          }
    
          // 鼠标按下
          canvas.onmousedown = function (event) {
            event.preventDefault() // 禁用默认事件
            var point = windowToCanvas(event.clientX, event.clientY) // 获取鼠标相对于 canvas 标签的坐标
            isMouseDown = true
            drawCanvasWithMagnifier(true, point) // 绘制在离屏canvas上绘制放大后的图像
          }
    
          // 鼠标移动
          canvas.onmousemove = function (event) {
            event.preventDefault() // 禁用默认事件
            if (isMouseDown === true) {
              var point = windowToCanvas(event.clientX, event.clientY)
              drawCanvasWithMagnifier(true, point)
            }
          }
    
          // 鼠标松开
          canvas.onmouseup = function (event) {
            event.preventDefault() // 禁用默认事件
            isMouseDown = false
            drawCanvasWithMagnifier(false) // 不绘制离屏放大镜
          }
    
          // 鼠标移出canvas标签
          canvas.onmouseout = function (event) {
            event.preventDefault() // 禁用默认事件
            isMouseDown = false
            drawCanvasWithMagnifier(false) // 不绘制离屏放大镜
          }
        }
    
        /**
        * 返回鼠标相对于canvas左上角的坐标
        * @param {Number} x 鼠标的屏幕坐标x
        * @param {Number} y 鼠标的屏幕坐标y
        */
        function windowToCanvas(x, y) {
          var bbox = canvas.getBoundingClientRect() // bbox中存储的是canvas相对于屏幕的坐标
          return {
            x: x - bbox.x,
            y: y - bbox.y
          }
        }
    
        function drawCanvasWithMagnifier(isShow, point) {
          ctx.clearRect(0, 0, canvas.width, canvas.height) // 清空画布
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height) // 在画布上绘制图像
    
          /* 利用离屏,绘制放大镜 */
          if (isShow) {
            var { x, y } = point
    
            var mr = 50 // 正方形放大镜边长
    
            // (sx, sy): 待放大图像的开始坐标
            var sx = x - mr / 2,
              sy = y - mr / 2
    
            // (dx, dy): 已放大图像的开始坐标
            var dx = x - mr,
              dy = y - mr
    
            // 将offCanvas上的(sx,sy)开始的长宽均为mr的正方形区域
            // 放大到
            // canvas上的(dx,dy)开始的长宽均为 2 * mr 的正方形可视区域
            // 由此实现放大效果
            ctx.drawImage(offCanvas, sx, sy, mr, mr, dx, dy, 2 * mr, 2 * mr)
          }
          /*********************/
        }
      </script>
    </body>
    </html>
    ログイン後にコピー
    実装の効果は次のとおりです: キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?
    キャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

    スライダーをドラッグして画像を拡大または縮小します。次に、右クリックして画像を保存します。保存された画像には、以下に示すように、すでに透かしが入っています:

     2867537962-5b87e09ff1502_ARTICLEX.PNG

    . h3> 上 中央上、拡大鏡の基本ニーズ次の 2 つの部分に注意してください:


      canvas のマウス応答イベントの洗練された処理: スライド イン、スライド アウト、クリック、リリース

      オフスクリーン座標を再計算します (数式計算の詳細なアイデアについてはコード コメントを参照してください)

      🎜🎜 キャンバス ラベルに対するマウスの座標を再計算します (数式計算の詳細についてはコード コメントを参照してください)🎜🎜🎜 🎜コードは次のとおりです: 🎜rrreee🎜 虫眼鏡効果は下の図に示されています (赤いペンでマークされた領域が正方形の虫眼鏡です): 🎜🎜🎜🎜🎜🎜🎜🎜 関連する推奨事項: 🎜🎜🎜【HTML5】 Canvas は虫眼鏡効果を実現します🎜🎜🎜 🎜🎜🎜html+canvas で画面キャプチャを実現します🎜🎜🎜

    以上がキャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

See all articles