1. ホーム
  2. Web制作
  3. html5

html5 canvasベースの宿題添削用スモールプラグイン

2022-01-13 12:22:34

今日は、会社からの新しい要望、つまり、返却された課題写真に添削を落書きして、添削が終わったら添削写真と一緒にサーバーにアップロードできるようにしたいのです。これは、キャンバスにあまり慣れていない私にとっては難題です。

要求分析

  1. 修正能力は絵筆に匹敵する
  2. 筆おろしを行うことができること
  3. {を使用します。 全ブラシクリア {を使用します。
  4. ブラシの色を変換する

アイデアの技術的実現

  この要件を聞いて最初に思ったのは、canvasでやるということだったので、w3schoolで読んでみたところ キャンバスのAPI .

1. APIを使用して、画像をcanvasに転送する。 drawImage()

2 ペイントブラシの実装

  • マウスが押されたとき(マウスダウン)、開始X、開始Yのポイントが記録されます。
  • マウスを移動したとき(mousemove)、現在のマウス座標 e.clientX, e.clientY を取得し、左側の線の軸の最後の点(lineTo )を取得するので、水平線を描くことができる。
  • {を使用します。 マウスが左ボタンを離した時(mouseup)、mousemove関数をクリアする。

3. 関数をクリアする:drawImage()関数で元の画像を再度リセットするように指示する
4. Withdraw機能:マウスを押すたびにgetImageData()関数で現在の画像を取得して配列に記録し、withdrawを押したときにputImageData()関数でそれをキャンバスに入れるようにします。
5. 筆の色:strokeStyleのペンの色をmousemoveの中で変更する

コードの実装

マウスを動かして線を引くためのコード

let self = this;
    this.canvasNode = document.createElement('canvas');
    let styleString = this.utils.formatStyle(CANVAS_STYLE); // CANVAS_STYLE is the style of the canvas
    this.canvasNode.setAttribute('id','canvas');
    // Make sure to set the width and height
    let ratio = this.imgNode.width / this.imgNode.height, height = this.imgNode.height, width = this.imgNode.width;
    let tempWidth , tempHeight;
    // scale to scale
    if(ratio >= window.innerWidth / window.innerHeight){
      if(width > window.innerWidth){
        tempWidth = window.innerWidth;
        tempHeight = height * window.innerWidth / width;
      } else {
        tempWidth = width;
        tempHeight = height;
      }
    }else {
      if(height > window.innerHeight){
        tempWidth = width * window.innerHeight / width;
        tempHeight = window.innerHeight;
      }else{
        tempWidth = width;
        tempHeight = height;
      }
    }
    this.canvasNode.height = tempHeight;
    this.canvasNode.width = tempWidth;
    styleString = Object.assign({'width': tempWidth, 'height': tempHeight}, CANVAS_STYLE);
    this.canvasNode.setAttribute('style', styleString);

    let ctx = this.canvasNode.getContext('2d'), startX = 0, startY = 0;
    let image = new Image() ;
    image.setAttribute("crossOrigin",'Anonymous')
    // add a timestamp because the domain name of this image is not set cross domain https://www.jianshu.com/p/c3aa975923de
    image.src = this.imgNode.src + '?t=' + new Date().getTime(); 
    image.height = tempHeight;
    image.width = tempWidth;
    image.onload = function(){
      ctx.drawImage(image, 0, 0, tempWidth, tempHeight);
    }
    // Mouseover event
    let mousemoveFn = function(e) {
      ctx.beginPath();
      ctx.lineWidth = 3;
      ctx.strokeStyle = self.currentColor;
      if(startX == e.clientX - self.canvasNode.offsetLeft || startY === e.clientY - self.canvasNode.offsetTop ) return
      ctx.moveTo(startX,startY);
      ctx.lineTo(e.clientX - self.canvasNode.offsetLeft , e.clientY - self.canvasNode.offsetTop );
      ctx.stroke();
      startX = e.clientX - self.canvasNode.offsetLeft;
      startY = e.clientY - self.canvasNode.offsetTop ; // 37 is the height of the header
    }
    // mouse press event
    this.canvasNode.addEventListener("mousedown",function(e){
      startX = e.clientX - self.canvasNode.offsetLeft;
      startY = e.clientY - self.canvasNode.offsetTop ;

      // If you record in mouseup, you have to do one more step when you withdraw
      let imageData = ctx.getImageData(0,0, self.canvasNode.width, self.canvasNode.height);
      self.imageDataArray.push(imageData); // This imageDataArray is used to record the strokes of the brush
      self.canvasNode.addEventListener("mousemove", mousemoveFn, false);
    },false);
    this.canvasNode.addEventListener('mouseup', function(e){
      self.canvasNode.removeEventListener('mousemove', mousemoveFn);
    });
    this.bgNode.appendChild(this.canvasNode);

問題点

1。画像のクロスドメインの問題 このドメインは、唯一の192.168.6.*クロスドメインに設定されているため、私のlocalhostドメインはクロスドメインの問題を報告します(唯一の192.168.6.*クロスドメインに同僚が私に言った、それ以外の場合はまだ問題をチェックする愚かです)。

解決策:vue.config.js ファイルで dev 配下のホストを設定する。

2. toDataURL()メソッドで拡大縮小して保存すると、base64出力後に画像のサイズが変化してしまう。理由は キャンバスに画像を描画する際に、上記のコードで画像を拡大縮小するアルゴリズムを使って画像を小さくしたため、キャンバスに描画される画像も小さくなってしまった...。

解決方法 (解決済み)

概要

  • canvas と画像の組み合わせに初めて触れたとき、canvas の API に慣れ親しみました。
  • やったことのない機能に出会う前に、まず知っていることを使って実現可能な方法がないかを考え、突破口を見つけるとできるようになる、という心構えが必要です
  • {を使用します。 知らない知識に出会ったら、まずapiを見ること、以前はcanvasのことをあまり知らなかったが、何度かapiを見ているうちに機能ができるようになり、w3schoolで見た例を見て、canvasは本当に強力だと感じた。

添削宿題をするためのhtml5キャンバスベースの小さなプラグインについてのこの記事はここで紹介されて、より関連するキャンバス添削宿題プラグインの内容は、スクリプトホーム過去の記事を検索するか、次の関連記事を閲覧を続けてください、私はあなたがよりスクリプトホームをサポートすることを願っています!。