Fabric.js は DIY ポストカード機能を実装します

Fabric.js は DIY ポストカード機能を実装します

この記事では、DIYポストカード機能を実現するためのfabricjsの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

序文

要件には、2 本の指での追加、コピー、削除、拡大/縮小が含まれます。

ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。

1. fabric.jsは非常に便利なキャンバス操作プラグインです

例: pandas は、データ分析タスクを解決するために作成された NumPy ベースのツールです。

2. コード例

コードは次のとおりです(例):

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
<title>手作り</title>
<メタ文字セット="utf-8">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="アクセス制御許可オリジン" content="*" />
<meta http-equiv="有効期限" content="-1">
<meta http-equiv="キャッシュコントロール" content="キャッシュなし">
<meta http-equiv="プラグマ" content="キャッシュなし">
<script src="./js/jquery-3.4.1.min.js"></script>
<script src="./js/fabric.js"></script>
<script src="./js/customiseControls.min.js"></script>
</head>
<スタイル>
  体{
    マージン: 0;
    パディング: 0;
    境界線: 0;
    フォントサイズ: 100%;
    フォントの太さ: 標準;
    垂直位置合わせ: ベースライン;    
  }  
  。終わり{
    位置: 固定;
    上: 0;
    右: 0;
    幅: 50px;
    高さ: 20px;
    背景色: #000000;
    色: #ffffff;
    フォントサイズ: 12px;
    行の高さ: 20px;
    zインデックス: 9999;
  }
  .canvasimg{
    位置: 固定;
    上: 0;
    左: 0;
    幅: 50px;
    高さ: 20px;
    背景色: #000000;
    色: #ffffff;
    フォントサイズ: 12px;
    行の高さ: 20px;
    zインデックス: 9999;
  }
  .canvasimg 入力{
    位置: 絶対;
    上: 0;
    左: 0;
    幅: 100%;
    高さ: 100%;
    不透明度: 0;
  }
  #インラインボタン{
    位置: 固定;
    不透明度: 0;
    zインデックス: 999;
  }
  #addinline-btn{
    不透明度: 0;
    位置: 固定;
    zインデックス: 999;
  }  
  .canvassrc{
    位置: 固定;
    上: 0;
    右: 0;
    幅: 100%;
    高さ: 100%;
    zインデックス: 9999;
  }
</スタイル>
<本文>
  <div class="canvasimg"><input type="file" name="" id="canvasimg" class="canvasimgadd" type="file" accept="image/*" onchange="selectFileImage(this);" >画像を追加</div>
  <div class="end" onclick="linkcanvas()">画像を生成</div>
  <button id="inline-btn" onclick="canvasonclick()">画像削除ボタン</button>
  <button id="addinline-btn" onclick="copy()">画像コピーボタン</button>
  <キャンバスid="c"></キャンバス>
</本文>
</html>
<スクリプト>
  //参考リンク//記事の最後にAPIの詳細な中国語説明があります//http://fabricjs.com/ fabric.js公式サイト//DIY機能にはコピー機能、削除機能、ズームイン、ズームアウト、移動、回転が必要です//新しい画像機能を追加するselectFileImage(fileObj){
    var ファイル = fileObj.files['0'];
    var リーダー = 新しい FileReader();
    reader.readAsDataURL(ファイル)
    reader.onload = 関数 (e) {
      fabric.Image.fromURL(e.target.result, 関数(img) {
        img.scale(1).set({
          left: webwidth - (webwidth / 2)、//画像を左右中央に配置します top: webheight - (webheight / 2)、//画像を上下中央に配置します。画面の高さの合計値 - (画像の高さ / 2) / 2
          angle: 0, //角度は0です
          originX: 'center'、
          originY: 'center'、
        });
        // 画像のデフォルトの幅は画面いっぱいに表示され、片側に 20 ピクセルのスペースが残ります。高さは適応的です img.scaleToWidth(webwidth - 40)
        キャンバスに画像を追加します。アクティブオブジェクトを設定します。
        // 線をクリアします img.hasBorders = false;
        //画像機能ボタンをカスタマイズし、冗長な機能ボタンを非表示にして、四隅のボタンのみを残します canvas.forEachObject(function (em) {
          em['setControlVisible']('mtr', false);
          em['setControlVisible']('mt', false);
          em['setControlVisible']('ml', false);
          em['setControlVisible']('mb', false);
          em['setControlVisible']('mr', false);
          em['setControlVisible']('mt', false);
        })
      });
    }
  }


  // 削除ボタン var btn = document.getElementById('inline-btn')
  // ボタンを追加 var addbtn = document.getElementById('addinline-btn')

  // 画面の高さと幅を取得します var webwidth = $(window).width()
  var webheight = $(window).height()
  //キャンバスを作成します var canvas = new fabric.Canvas('c');
  //キャンバスはデフォルトで画面いっぱいに広がります canvas.setWidth(webwidth)
    キャンバスの高さを設定します。
    //画像をインポート fabric.Image.fromURL('./imgs/2.jpg', function (img) {
      img.scale(1).set({
        left: webwidth - (webwidth/2)、//画像を左右中央に配置します top: webheight-(webheight/2)、//画像を上下中央に配置します。画面の高さの合計値 - (画像の高さ/2)/2
        angle: 0, //角度は0です
        originX: 'center'、
        originY: 'center'、
      });
      //画像のデフォルトの幅は、片側に20ピクセルの空白を残して画面いっぱいに表示され、適応性が非常に高いです。img.scaleToWidth(webwidth-40)
      キャンバスに画像を追加します。アクティブオブジェクトを設定します。
      // 線をクリアします img.hasBorders = false;
      //画像機能ボタンをカスタマイズし、冗長な機能ボタンを非表示にして、四隅のボタンのみを残します canvas.forEachObject(function(em){
        em['setControlVisible']('mtr', false); 
        em['setControlVisible']('mt', false);
        em['setControlVisible']('ml', false);
        em['setControlVisible']('mb', false);
        em['setControlVisible']('mr', false);
        em['setControlVisible']('mt', false);
      })
    });

    //複数選択をキャンセル canvas.selection = false;
    //新しいレイヤーは最上位レイヤーの canvas には表示されません。preserveObjectStacking = true;    
    //注: ボタンの機能をカスタマイズするには、fabric の customiseControls という別の JS プラグインを導入する必要があります。そうしないと機能しません。//4 つのボタンの機能をグローバルに変更します fabric.Canvas.prototype.customiseControls({
      bl: {
        action: 'rotate' //画像回転機能を追加},
      // hasRotatingPoint のみが false に設定されていない
    }、 関数 () {
      キャンバスをレンダリングします。
    });  

    //デフォルトのボタンスタイルは望んでいるものではないので、ボタン上のアイコンをカスタマイズする必要があります fabric.Object.prototype.customiseCornerIcons({
      tl: {
        icon: './img/[email protected]', //画像パス cornerSize: 70, //ボタンのクリック範囲はCSSのパディング属性設定に相当します: {
          cornerSize: 25 //アイコンサイズ},    
      },
      tr: {
        アイコン: './img/[email protected]',
        コーナーサイズ: 70,  
        設定: {
          コーナーサイズ: 25
        },         
      },
      bl: {
        アイコン: './img/[email protected]',
        コーナーサイズ: 70,  
        設定: {
          コーナーサイズ: 25
        },         
      },
      br: {
        アイコン: './img/[email protected]',
        コーナーサイズ: 70,
        設定: {
          コーナーサイズ: 25
        },         
      },
    }、 関数 () {
      キャンバスをレンダリングします。
    }); 

    //ボタンは画像の位置に従います function positionBtn(obj) {
      //現在選択されている画像の単位パラメータを取得します。var absCoords = canvas.getAbsoluteCoords(obj);
      btn.style.width = '30px';
      btn.style.height = '30px';
      btn.style.opacity = '0';
      btn.style.left = (absCoords.right - 30 / 2) + 'px';
      btn.style.top = (absCoords.top - 30 / 2) + 'px';

      addbtn.style.width = '30px';
      addbtn.style.height = '30px';
      addbtn.style.opacity = '0';
      addbtn.style.left = (absCoords.left - 30 / 2) + 'px';
      addbtn.style.top = (absCoords.leftTop - 30 / 2) + 'px';
    }

    fabric.Canvas.prototype.getAbsoluteCoords = 関数 (オブジェクト) {
      戻る {
        右: object.aCoords.tr.x + this._offset.left、
        top:object.aCoords.tr.y + this._offset.top、
        左: object.aCoords.tl.x + this._offset.left、
        左上: object.aCoords.tl.y + this._offset.top、
      };
    }


    //現在選択されている画像を削除する function canvasonclick(){
      var t = キャンバス.getActiveObject()
      キャンバスを削除します。
    }

    //現在選択されている画像をコピーする function copy(){
      var _self = これ;
      canvas.getActiveObject().clone(関数 (クローン) {
        _self.paste(複製)
        キャンバス.discardActiveObject().renderAll()
      })
    }    
    関数 paste(_clipboard){
      コンソールログ(_クリップボード)
      var t = canvas.getActiveObject();
      // 再度クローンを作成し、複数のコピーを作成します。
      t.clone(関数(clonedObj) {
        キャンバスを破棄します。
        クローンされたオブジェクト.set({
          左: clonedObj.left + 20、
          上: clonedObj.top + 20,
          イベント: true、
          境界線あり:false
        });
        clonedObj.type === 'activeSelection' の場合 {
          // アクティビティの選択にはキャンバスへの参照が必要です。
          clonedObj.canvas = キャンバス;
          clonedObj.forEachObject(関数 (obj) {
            キャンバスにオブジェクトを追加します。  
            キャンバス.forEachObject(関数 (em) {
              em['setControlVisible']('mtr', false);
              em['setControlVisible']('mt', false);
              em['setControlVisible']('ml', false);
              em['setControlVisible']('mb', false);
              em['setControlVisible']('mr', false);
              em['setControlVisible']('mt', false);
            })                      
          });
          // 選択できない問題を解決する clonedObj.setCoords();
        } それ以外 {
          キャンバスにクローンオブジェクトを追加します。
          キャンバス.forEachObject(関数 (em) {
            em['setControlVisible']('mtr', false);
            em['setControlVisible']('mt', false);
            em['setControlVisible']('ml', false);
            em['setControlVisible']('mb', false);
            em['setControlVisible']('mr', false);
            em['setControlVisible']('mt', false);
          })          
        }
      });     
    }

    var ストア = {}
    //平均値を計算する var getDistance = function (start, stop) {
      Math.hypot(stop.x - start.x, stop.y - start.y) を返します。
    };    

    //positionBtnイベントを監視します。マウスが画像の上にあるときに、画像をクリックして移動すると、カスタムのコピーボタンと削除ボタンがトリガーされ、画像の配置とダブルフィンガーのズームインとズームアウトが行われます。関数canvas.on('mouse:down',function(options){
      //画像ユニットがクリックされたかどうかを判定する if (options.target) {
        //イベントを実行する positionBtn(options.target);

        //ダブルフィンガーでズームイン、ズームアウト store.pageX = options.e.changedTouches[0].clientX
        store.pageY = options.e.changedTouches[0].clientY
        if (options.e.changedTouches.length == 2) {
          store.pageY2 = options.e.changedTouches[1].clientY
          store.pageX2 = options.e.changedTouches[1].clientX
        }
        store.originScale = options.target.scaleX || 0.5;
        オプションのターゲットを左に設定します。
        オプションをターゲットに追加します。
      }
    });                
    canvas.on('mouse:move',function(options){
      if(オプション.ターゲット){
        positionBtn(オプション.ターゲット);
        if (options.e.changedTouches.length == 2) {
          (!ストア.ページX2){
            store.pageX2 = options.e.changedTouches[1].clientX
          }
          (!ストア.ページY2){
            store.pageY2 = options.e.changedTouches[1].clientY
          }
          var ズーム = getDistance({
            x: options.e.changedTouches[0].clientX、
            y: オプション.e.changedTouches[0].clientY
          }, {
            x: オプション.e.changedTouches[1].clientX、
            y: オプション.e.changedTouches[1].clientY
          }) /
            距離を取得します({
              x: ストア.ページX、
              y: ストアページY
            }, {
              x: ストア.ページX2、
              y: ストア.ページY2
            });
          var newScale = store.originScale * ズーム;
          (新しいスケール > 3) の場合 {
            新しいスケール = 3;
          } 
          options.target.scaleX = 新しいスケール;
          options.target.scaleY = 新しいスケール;
          キャンバスをレンダリングします。
        }          
      }
    });  
    キャンバス.on('mouse:up',function(options){
      if(オプション.ターゲット){
        positionBtn(オプション.ターゲット);   
        ストア.ページY = 0
        ストア.ページX = 0
        ストア.ページY2 = 0
        ストア.ページX2 = 0    
        store.originScale = オプション.target.scaleX 
        store.originleft = オプション.target.left  
        store.origintop = オプション.target.top      
      }
    }); 

    //ポストカードを生成する function linkcanvas(){
      xheight = $('#c').height() とします。
      xwidth = $('#c').width() とします。
      キャンバスの背景色を設定します。
      var エクスポートされたアート = this.canvas.toDataURL({
        フォーマット: "jpeg",
        品質: 1.0、
        乗数: 2.4、
        左: 0,
        上: 0,
        幅: x幅、
        高さ: x高さ、
      });
      $('body').append(`<img class="canvassrc" src="${exportedArt}"/>`)
    }

</スクリプト>

成果を達成する

要約する

具体的な方法や知識のポイントについては、この記事を参照することをお勧めします。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • キャンバス操作プラグイン fabric.js の使い方を詳しく解説

<<:  MySQL でストアド プロシージャを作成し、ループでレコードを追加する方法

>>:  CentOS 7 で PHP 5.4 を 5.6 にアップグレードする方法の簡単な分析

推薦する

Red Hat Enterprise Linux 8 をベースにした CentOS 8 が正式にリリースされました

CentOS プロジェクトは、Red Hat の再配布要件に完全に準拠した、Red Hat Ente...

未来志向の総合的なウェブデザイン:プログレッシブエンハンスメント

<br />原文: プログレッシブエンハンスメントを理解するアーロン・ガスタフソン翻訳:...

ネイティブJSでマウススライドによる愛の拡散効果を実現

この記事では、マウスをスライドすると愛が広がる js 特殊効果を紹介します。効果は次のとおりです。 ...

TypeScriptにおけるunknownとanyの違いについて詳しく説明します

目次序文1. 不明 vs 任意2. 未知とあらゆるもののメンタルモデル3. まとめ要約する序文any...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

JavaScript で Priority Queue を実装する

目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...

Vue-CLI3.xはプロジェクトをサーバーに自動的にデプロイします

目次序文1. scp2をインストールする2. テスト/本番環境サーバーのSSHリモートログインアカウ...

jquery+springbootでファイルアップロード機能を実現

この記事の例では、ファイルアップロード機能を実現するためのjquery+springbootの具体的...

Vue ポーリング リクエスト ソリューションの完全な例

世論調査の理解実際、ポーリングの焦点はループ自体ではなく、実行間の間隔にあります。 Ajax は非同...

デザイン理論:フォントデザインの基礎

<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...

JavaScript ベースのシンプルなカルーセルの実装

この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...

MySQL 8.0.17 のインストールと設定のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...

CSS3 パッケージ化後にプレフィックスプラグインを自動的に追加する方法の詳細な説明: autoprefixer

vue-cli で構築されたプロジェクト スキャフォールディングでは、すでに autoprefix...

HTML ファイルにファイルの内容を含める方法の概要

フォーラムでは、ネットユーザーから「HTML ファイル内の別の HTML ファイルの内容を読み取るこ...

MySQL でテーブルスペースの断片化を解消する詳細な例

MySQL でテーブルスペースの断片化を解消する詳細な例断片化の原因(1)テーブルのストレージは断片...