建国記念日が近づいています。JS を使用して、建国記念日風のアバターを生成する小さなツールを実装します。実装プロセスの詳細な説明

建国記念日が近づいています。JS を使用して、建国記念日風のアバターを生成する小さなツールを実装します。実装プロセスの詳細な説明

ここで使用されるテクノロジーは次のとおりです。

  • HTML+CSS+JavaScript;
  • download.js ライブラリ;
  • fabric.js ライブラリ;

まず、体験リンク g.cuggz.com/ にアクセスしてください。​

注:上記のリンクをクリックして使用できますが、私のドメイン名はTXによってブロックされており、まだ異議申し立て中であるため、QQまたはWeChatで開くことはできません。表示して使用するには、リンクをブラウザにコピーする必要があります。​

ガジェットのスクリーンショットは次のとおりです。

1. ページレイアウト

この部分についてはあまり説明しません。コードに直接進みます。

<div class="wrapper">
    <!-- ボックスを選択 -->
    <div class="main-box">
      <a class="prev" onClick='changeHat()'></a>
      <div class="main-img">
        <div id="コンテンツ">
          <キャンバスid='cvs'></キャンバス>
        </div>
      </div>
      <a class="next" onClick='changeHat()'></a>
    </div>
    <!-- グラフをエクスポート -->
    <img id='export-img' alt='建国記念日限定アバター' src='' crossorigin="anonymous"/>
    <!-- アクション ボタン -->
    <div class="操作-btns">
      <a class="upload-btn">
        <input id='upload' type='file' onchange='viewer()' style='opacity: 0;'/>
      </a>
      <a class="export-btn" onClick='exportFunc()'></a>
    </div>
  </div>
 <!-- テンプレート -->
  <div スタイル = '表示: なし'>
    <img id='img' src='' alt='' />
    <img class='hide' id='hat0' src='img/1.png' />
    <img class='hide' id='hat1' src='img/2.png' />
    <img class='hide' id='hat2' src='img/3.png' />
    <img class='hide' id='hat3' src='img/4.png' />
    <img class='hide' id='hat4' src='img/5.png' />
    <img class='hide' id='hat5' src='img/6.png' />
    <img class='hide' id='hat6' src='img/7.png' />
  </div>

このページは比較的シンプルです。外側に大きな背景画像があり、真ん中にアバター表示ボックスとテンプレート切り替えボタン、その下にアップロードボタンとダウンロードボタンがあります。ページレイアウトが完了したら、スタイルを記述します。CSSコードは次のとおりです。

体、
html{
    最小高さ: 100%;
    幅: 100%;
    ユーザー選択: なし;
    フォントサイズ: 18px;
}

.ラッパー{
    幅: 100%;
    高さ: 100%;
    最大幅: 620px;
    最大高さ: 800px;
    マージン: 0 自動;
    背景画像: url('../img/bg.png');
    背景繰り返し: 繰り返しなし;
    背景サイズ: 100% 100%;
    パディングトップ: 13em;
}

#エクスポート画像{
    表示:なし;
    マージン:0 自動;
    幅:250px;
    高さ:250px;
}

.メインボックス{
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    コンテンツの中央揃え: 中央;
}

.メインボックス.next,
.メインボックス.前へ{
    背景画像: url('../img/next.png');
    背景サイズ: 含む;
    境界線の半径: 50%;
    幅: 2.275rem;
    高さ: 2.275rem
}

.メインボックス.前へ{
    変換: 回転(180度)
}

.メインボックス .メイン画像 {
    マージン: 0.75rem;
    背景: #fff;
    境界線: .25rem 実線 #fbe6b5;
    境界線の半径: .75rem;
    フォントサイズ: 0
}

#コンテンツ {
    境界線の半径: .5rem;
    位置: 相対的;
    幅:9.5rem;
    高さ:9.5rem;
    左マージン: 50%;
    変換: translateX(-50%);
    オーバーフロー: 非表示
}

.操作ボタン{
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    コンテンツの中央揃え: 中央;
    flex-direction: 列;
    上マージン: .75rem
}

.操作ボタン .アップロードボタン {
    幅: 11.6rem;
    高さ:3.6rem;
    背景サイズ: 100% 100%;
    背景画像: url('../img/upload.png')
}

.操作ボタン .エクスポートボタン {
    表示: なし;
    幅: 11.6rem;
    高さ:3.75rem;
    背景サイズ: 100% 100%;
    背景画像: url('../img/export.png')
}

ここでは、参考のために簡単な実装を示します。最適化できる領域はまだたくさんありますが、ここでは変更しません。興味のある方は自分でカスタマイズできます。

2. 画像のアップロードと表示

次のステップはロジック部分を実装することです。まず、後で使用するグローバル変数をいくつか定義する必要があります。

let canvasFabric; // Canvas インスタンス let hat = "hat0"; // 現在のテンプレートクラス
let hatInstance; // テンプレート レイヤー インスタンス const screenWidth = document.getElementById("content").scrollHeight; // コンテンツ ボックスの高さ

その後、アップロードされた画像を処理してページに表示する必要があります。

関数ビューア() {
  // アップロードされた画像ファイルを取得します。const file = document.getElementById("upload").files[0];
  // 画像を表示するために必要なタグを取得します。const img = document.getElementById("img");
  // ファイルオブジェクトを読み取るためのファイルを作成します。const reader = new FileReader();
  if (ファイル) {
    //ファイルをBase64に変換する
    reader.readAsDataURL(ファイル);
    // ファイルが正常に読み込まれたときにトリガーされます reader.onload = () => {
      // 画像を表示するタグに base64 URL を割り当てます。img.src = reader.result;
      // 画像の読み込み完了トリガー img.onload = () => img2Cvs(img);
    }
  } それ以外 {
    画像ソース = ""
  }
}

ここでは、ファイルを読み取るためのメソッドと読み取り結果を含むイベント モデルを提供するHTML5 FileReaderオブジェクトが使用されます。オブジェクトを初期化するには、new を使用できます。FileReader FileReaderには 4 つのメソッドが含まれており、そのうち 3 つはファイルの読み取りに使用され、1 つは読み取りを中断するために使用されます。読み取りが成功したか失敗したかに関係なく、メソッドは読み取り結果を返さないことに注意してください。読み取り結果はresult属性に格納されます。ここではreadAsDataURLメソッドが使用されています。MDNではこのメソッドを次のように説明しています。

readAsDataURLメソッドは、指定された Blob または File オブジェクトを読み取ります。読み取り操作が完了すると、 readyStateが DONE に変わり、 loadend (en-US)イベントがトリガーされます。同時に、result 属性には、読み取ったファイルの内容を表す data: URL (base64 エンコード) 形式の文字列が含まれます。

つまり、アップロードされた画像はBase64形式の URL に変換され、画像を表示するタグに割り当てられ、そのタグにアバターが表示されます。効果は以下のとおりです。

これで画像のアップロードと表示は完了です。次はキャンバスを初期化します。

3. キャンバスを初期化する

上記コードの最後で、img.load が実行されます。ここでの onload イベントは、画像が読み込まれた直後に実行されます。画像が表示された後、img2Cvs メソッドが実行されます。このメソッドは主にキャンバスを初期化し、ページの一部の要素を表示および非表示にするために使用されます。

img2Cvsメソッドでは、 fabricライブラリが使用されます。Fabric.js は、 Canvasプログラムの記述を簡素化できるライブラリです。 Fabric.jsCanvasに欠けているオブジェクト モデル、SVG パーサー、インタラクション、その他不可欠なツール一式を提供します。 Canvas優れたキャンバス機能を提供しますが、API は十分に使いやすくありません。 Fabric.jsこの目的のために開発され、主にオブジェクトを使用してコードを記述します。 Fabric.js は次のことが可能です。

  • Canvas上にグラフィック(画像、テキスト、通常のグラフィック、複雑なパスで構成されたグラフィックなど)を作成して塗りつぶします。
  • 図形をグラデーションカラーで塗りつぶします。
  • 結合されたグラフィック(結合されたグラフィック、グラフィックテキスト、画像などを含む)。
  • グラフィカルアニメーションを設定して、ユーザーインタラクションを設定します。
  • JSON、SVG データなどを生成します。
  • 生成された Canvas オブジェクトにはドラッグ アンド ドロップ機能が付属しています。

fabric.js ライブラリは npm コマンドでインストールできます。

npm インストール ファブリック --save

CDN 経由で参照することもできます:

<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.6/fabric.min.js"></script>

img2Cvsメソッドがどのように実装されているかを見てみましょう。

関数 img2Cvs(img) {
   // キャンバスを取得して表示し、キャンバスのサイズを画像のサイズに設定します。const cvs = document.getElementById("cvs");
    cvs.width = img.width;
    cvs.height = img.height;
    cvs.style.display = "ブロック";
   
   // キャンバスを作成し、その位置と背景画像を設定します。canvasFabric = new fabric.Canvas("cvs", {
      幅: 画面幅、
      高さ: 画面幅、
      背景画像: 新しい fabric.Image(img, {
        スケールX: 画面幅 / 画像幅、
        スケールY: 画面幅 / 画像の高さ
      })
    });
   // スイッチテンプレート changeHat();
  // 画像のアップロードボタンを非表示にして、画像のダウンロードボタンを表示します。 document.getElementsByClassName("upload-btn")[0].style.display = "none";
    document.getElementsByClassName("export-btn")[0].style.display = "ブロック";
  }

ここでのfabric.Canvas()メソッドには 2 つのパラメータがあります。最初のパラメータはcanvas ID、2 番目のパラメータはキャンバスを初期化する際の設定項目です。ここでは、初期のキャンバス サイズと背景画像を設定し、アップロードしたアバターを背景画像として使用します。ここでの背景画像は、インスタンス化された fabric.Image オブジェクトです。初期化時のオブジェクトの最初のパラメーターは画像オブジェクトであり、2 番目のパラメーターは画像のスタイル設定構成オブジェクトです。​

キャンバスを作成したら、最初のテンプレートに切り替えて、画像のアップロードボタンを非表示にし、アバターのダウンロードボタンを表示する必要があります。これで最初のステップは完了です。それでは、既存のテンプレートを切り替える方法を見てみましょう。

4. テンプレートを切り替える

次に、テンプレートを切り替える方法を見てみましょう。

関数changeHat() {
   // 現在のテンプレートを非表示にします document.getElementById(hat).style.display = "none";
   // すべてのテンプレートを取得します。const hats = document.getElementsByClassName("hide");
    hat = "hat" + (+hat.replace("hat", "") + 1) % hats.length;
   // 現在のテンプレートを取得して表示します const hatImage = document.getElementById(hat);
    hatImage.style.display = "ブロック";
   // レイヤーがすでに存在する場合は削除します if (hatInstance) {
      キャンバスファブリックを削除します。
    }
   // 現在のテンプレートをレイヤーオブジェクトとして追加する hatInstance = new fabric.Image(hatImage, {
      上: 0,
      左: 0,
      スケールX: スクリーン幅 / ハットイメージ幅、
      スケールY: screenWidth / hatImage.height、
      コーナーカラー: "#0b3a42",
      コーナーストロークカラー: "#fff",
      コーナースタイル: "円",
      transparentCorners: false、
      回転ポイントオフセット: 30
    });
   // レイヤーオブジェクトを非伸縮可能に設定する hatInstance.setControlVisible({
       mt: 誤り、 
       mb: 偽、 
       ml: 偽、 
       mr: 間違いです、 
       bl: 誤り、 
       br: 誤り、 
       tl: 誤り、 
       tr: 偽、 
       mtr: 偽、 
    })
   // レイヤーをキャンバスに追加します canvasFabric.add(hatInstance);
  }

デフォルトでは、fabric.js 要素には、任意のオブジェクトを拡大縮小するための 8 つのポイントがあります。ここでは、ユーザーがfabricオブジェクトを水平または垂直に引き伸ばせないようにする必要があります。setControlsVisibility setControlsVisibility()メソッドを使用して、これを非伸縮に設定できます。このメソッドでは、8 つのスケーリング ポイントを含む構成オブジェクトを渡す必要があります。これらのポイントはすべてfalseに設定されています。​

最後に、テンプレートによって生成されたレイヤーをキャンバスに追加します。ここでは、fabric によって提供されるイベントである add メソッドを使用します。以下は、fabric.js によって公式に提供される一般的なイベントです。

  • object:addedレイヤーを追加
  • object:modified編集レイヤー
  • object:removed
  • selection:created最初に選択されたレイヤー
  • selection:updatedレイヤー選択の変更
  • 選択selection:cleared選択したレイヤーをクリアします

5. 画像を出力する

上記の手順を実行すると、キャンバスが初期化されます。キャンバスの背景は、アップロードした画像です。キャンバスには、選択したテンプレートのレイヤーもあります。最後のステップは、合成した画像を出力することです。 「画像のダウンロード」ボタンをクリックすると何が起こるか見てみましょう。

関数 exportFunc() {
  // 選択ボックス、アップロードおよびダウンロード ボタン、キャンバスを非表示にします。 document.getElementsByClassName("main-box")[0].style.display = "none";
  document.getElementsByClassName("operation-btns")[0].style.display = "なし";
  document.getElementById("cvs").style.display = "なし";

  // キャンバスから URL を生成し、表示用の対応するタグに割り当てます。const exportImage = document.getElementById("export-img");
  exportImage.style.display = "ブロック";
  exportImage.src = canvasFabric.toDataURL({
    幅: 画面幅、
    高さ: 画面幅
  });
  // 生成された画像をダウンロードします window.confirm("アバターをダウンロードしますか") ? download(exportImage.src, "ナショナルデーアバター", 'image/png') : void 0
}

ここでは、キャンバス インスタンス オブジェクトから画像を生成するためにtoDataURLメソッドを使用します。これは、キャンバスを画像としてエクスポートし、 Base64形式で URL をエクスポートできるfabricオブジェクトのメソッドです。このように、img タグは URL を取得した後に最終的な画像を表示できます。​

最後に、生成されたアバターをダウンロードするためのオプション機能が追加されます。ここではdownload.jsライブラリが使用されます。このメソッドの最初のパラメーターは画像の URL、2 番目のパラメーターはダウンロードした画像の名前、3 番目のパラメーターは画像の形式です。​

これらはすべて、この小さなアプリケーションの機能です。これは単純な実装であり、まだバグがあります。主に実装のアイデアを提供します。これまでキャンバスの概念に触れたことがなかったので、今回は多くのことを学びました。今後時間があるときに、その使い方についてもっと詳しく学んでみたいと思います。 interesting !​

これで、建国記念日、JS を使用して建国記念日風のアバターを生成するツールを実装する方法、および詳細な実装プロセスに関するこの記事は終了です。JS を使用して建国記念日風のアバターを生成することに関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript の差異を利用して比較ツールを実装する
  • node.js を使用してフレームごとのアニメーションを生成する小さなツールを開発する方法
  • Node.js がチケット取得ガジェットと SMS 通知リマインダー機能を実装
  • Java9のJShellガジェットとコンパイラの2つの自動最適化方法
  • Node.jsはJSファイルマージツールを実装します
  • JavaScript は SQL を stringBuffer に変換する小さなツールを作成します
  • jsでブックマークレットを作成する理論
  • hta[javascript] で書かれた、スケジュールされた再起動またはシャットダウンのための小さなツール

<<:  Docker Tomcat のアクセス インターフェイスが表示されないのはなぜですか?

>>:  MySQLで時間を判定条件として使用する方法

推薦する

Vue ローカルコンポーネントデータ共有 Vue.observable() の使用

コンポーネントが詳細になるにつれて、複数のコンポーネントが状態を共有する状況に遭遇するでしょう。Vu...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

PrometheusとGrafanaを使用したMySQLサーバーのパフォーマンス監視の詳細な説明

概要Prometheus は、HTTP プロトコルを介してリモート マシンからデータを収集し、ローカ...

Kali Linux システムのバージョンを確認する方法

1. Kali Linuxシステムのバージョンを確認するコマンド: cat /etc/issue 2...

Dockerボリュームマウントの実装方法

最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...

要素のフォームコンポーネントに関する注意事項

要素フォームとコード表示詳細はエレメントフォーム公式サイトをご覧ください構造と機能の分析紹介とソース...

MySQLデータベースの共通操作スキルのまとめ

この記事では、MySQL データベースの一般的な操作テクニックをまとめます。ご参考までに、詳細は以下...

複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明

背景今日、他のプロジェクト チームと協力してシス​​テムのストレス テストを実施しているときに、プロ...

WeChatアプレット開発によりホームページポップアップボックスアクティビティガイダンス機能が実現

目次1. 需要2. データベース設計3.Javaバックグラウンド構成の実装4. WeChatアプレッ...

Docker管理に関する断片的な知識のまとめ

目次1. 概要2. 応用例2.1、Docker コンテナ分離名前空間2.2. Docker のフリー...

jQuery で呼吸カルーセル効果を実現

この記事では、呼吸カルーセル効果を実現するためのjQueryの具体的なコードを参考までに共有します。...

Vue はグラフィック検証コードログインを実装します

この記事では、グラフィック認証コードログインを実装するためのVueの具体的なコードを参考までに紹介し...

HTML で特定のテキストを非表示にするにはどうすればよいでしょうか?

テキスト非表示コード、HTML 内の特定のテキストを非表示にするコードをコピーコードは次のとおりです...

サブセットかどうかを判断するためのMySQLメソッドの手順

目次1. 問題2. 解決策オプション1:オプション2: 1. 問題この話は、エラーと脱落率を照会する...