検索
ホームページウェブフロントエンドH5 チュートリアルキャンバス オフスクリーン テクノロジーとは何ですか?キャンバスの虫眼鏡効果を実現するにはどうすればよいですか?

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

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 までご連絡ください。
    H5およびHTML5:Web開発で一般的に使用される用語H5およびHTML5:Web開発で一般的に使用される用語Apr 13, 2025 am 12:01 AM

    H5とHTML5は、同じこと、つまりHTML5を参照します。 HTML5はHTMLの5番目のバージョンであり、セマンティックタグ、マルチメディアサポート、キャンバスとグラフィックス、オフラインストレージ、ローカルストレージなどの新しい機能をもたらし、Webページの表現力と互換性を向上させます。

    H5は何を参照していますか?コンテキストの探索H5は何を参照していますか?コンテキストの探索Apr 12, 2025 am 12:03 AM

    H5ReferStoHtml5、apivotaltechnologyinwebdevelopment.1)html5introduceSnewelementsandapisforrich、dynamicwebapplications.2)Itupp ortsmultimediawithoutplugins、endancingurexperiencecrossdevices.3)semanticelementsimprovecontentstructurendseo.4)H5'srespo

    H5:ツール、フレームワーク、およびベストプラクティスH5:ツール、フレームワーク、およびベストプラクティスApr 11, 2025 am 12:11 AM

    H5開発で習得する必要があるツールとフレームワークには、Vue.JS、React、Webpackが含まれます。 1.Vue.jsは、ユーザーインターフェイスの構築に適しており、コンポーネント開発をサポートします。 2.複雑なアプリケーションに適した仮想DOMを介したページレンダリングを最適化します。 3.Webpackは、モジュールのパッケージングに使用され、リソースの読み込みを最適化します。

    HTML5の遺産:現在のH5の理解HTML5の遺産:現在のH5の理解Apr 10, 2025 am 09:28 AM

    html5hassificlytransformdedwebdeveverment byintroducingsingingelements、endincemultimediasupport、およびrequrovingperformance.1)itmadewebsitesmoreaccessibleandseo-frendlywithsemantelementslike、and.2)

    H5コード:アクセシビリティとセマンティックHTMLH5コード:アクセシビリティとセマンティックHTMLApr 09, 2025 am 12:05 AM

    H5は、セマンティック要素とARIA属性を介して、WebページのアクセシビリティとSEO効果を改善します。 1.使用などを使用して、コンテンツ構造を整理し、SEOを改善します。 2。ARIA-LabelなどのARIA属性はアクセシビリティを強化し、支援技術ユーザーはWebページをスムーズに使用できます。

    H5はHTML5と同じですか?H5はHTML5と同じですか?Apr 08, 2025 am 12:16 AM

    「H5」と「HTML5」はほとんどの場合同じですが、特定の特定のシナリオでは異なる意味を持つ可能性があります。 1。「HTML5」は、新しいタグとAPIを含むW3C定義標準です。 2。 "H5"は通常、HTML5の略語ですが、モバイル開発では、HTML5に基づくフレームワークを参照する場合があります。これらの違いを理解することは、プロジェクトでこれらの用語を正確に使用するのに役立ちます。

    H5の機能は何ですか?H5の機能は何ですか?Apr 07, 2025 am 12:10 AM

    H5、またはHTML5は、HTMLの5番目のバージョンです。開発者により強力なツールセットを提供し、複雑なWebアプリケーションを簡単に作成できるようにします。 H5のコア関数には、次のものが含まれます。1)Webページにグラフィックとアニメーションを描画できる要素。 2)Webページ構造をSEOの最適化を明確かつ助長させるなどのセマンティックタグなど。 3)Geolocationapiなどの新しいAPIは、ロケーションベースのサービスをサポートします。 4)互換性テストとポリフィルライブラリを通じて、クロスブラウザーの互換性を確保する必要があります。

    H5リンクの実行方法H5リンクの実行方法Apr 06, 2025 pm 12:39 PM

    H5リンクを作成する方法は?リンクターゲットを決定します。H5ページまたはアプリケーションのURLを取得します。 HTMLアンカーの作成:&lt; a&gt;を使用しますアンカーを作成し、リンクターゲットURLを指定するタグ。リンクプロパティの設定(オプション):必要に応じて、ターゲット、タイトル、およびオンクリックプロパティを設定します。 Webページに追加:リンクを表示するWebページにHTMLアンカーコードを追加します。

    See all articles

    ホット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ヘンタイを無料で生成します。

    ホットツール

    MantisBT

    MantisBT

    Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強力な PHP 統合開発環境

    EditPlus 中国語クラック版

    EditPlus 中国語クラック版

    サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境