JavaScript モバイル H5 画像生成ソリューションの説明

JavaScript モバイル H5 画像生成ソリューションの説明

現在、WeChatパブリックアカウントの運用活動が多く、写真を生成する必要があります。生成された写真は友達に送信され、友達の輪に広められ、製品の宣伝に役立ちます。

1.

キャンバスを使用して画像を生成することもできますが、html2canvas というオープンソース ライブラリがすでに存在するため、時間を節約するために自分では作成しませんでした。

githubアドレス: html2canvas

ライブデモ

    /**
     * window.devicePixelRatio に従ってピクセル比を取得します*/
    関数DPR() {
        (window.devicePixelRatio && window.devicePixelRatio > 1) の場合 {
            window.devicePixelRatio を返します。
        }
        1 を返します。
    }
    /**
     * 渡された値を整数に変換します */
    関数parseValue(値) {
        parseInt(値、10)を返します。
    };
    /**
     * キャンバスを描く
     */
    非同期関数drawCanvas(セレクタ){
        // 変換したい DOM ノードを取得します。const dom = document.querySelector(selector);
        DOM のスタイルを DOM に設定します。
        // DOM ノードの計算された幅と高さ const width = parseValue(box.width);
        定数height = parseValue(box.height);
        // ピクセル比を取得します。const scaleBy = DPR();
        // カスタム キャンバス要素を作成します。 var canvas = document.createElement('canvas');
        // キャンバス要素の属性の幅と高さを DOM ノードの幅と高さ * ピクセル比に設定します。canvas.width = width * scaleBy;
        キャンバスの高さ = 高さ * スケール;
        // キャンバス CSS の幅と高さを DOM ノードの幅と高さに設定します。canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;
 
        // ブラシを取得します const context = canvas.getContext('2d');
 
        // 描画されたすべてのコンテンツをピクセル比で拡大縮小します context.scale(scaleBy, scaleBy);
 
        x = 幅とします。
        y = 高さとします。
        戻り値 html2canvas(dom, {canvas}).then(function () {
            convertCanvasToImage(キャンバス、x、y)
        })
    }
 
    /**
     * 画像をbase64形式に変換します*/
    関数 convertCanvasToImage(キャンバス, x, y) {
        image = new Image();
        _container = document.getElementsByClassName('container')[0] とします。
        _body = document.getElementsByTagName('body')[0] とします。
        画像の幅 = x;
        画像の高さをyに設定します。
        image.src = canvas.toDataURL("image/png");
        _body.removeChild(_container);
        document.body.appendChild(画像);
        画像を返します。
    }
    キャンバスを描画します('.container')

2.

最近の携帯電話は画面が高画質なので、加工しないと画像がぼやけてしまいます。なぜぼやけてしまうのでしょうか?これにはデバイスのピクセル比が関係します。devicePixelRatio jsはデバイスのピクセル比を取得するためにwindow.devicePixelRatioを提供します。

関数DPR() {
        (window.devicePixelRatio && window.devicePixelRatio > 1) の場合 {
            window.devicePixelRatio を返します。
        }
        1 を返します。
    }

このDPR関数はデバイスのピクセル比を取得するために使用されます。ピクセル比を取得した後は何をすればよいでしょうか?

var キャンバス = document.createElement('キャンバス');
        // キャンバス要素の属性の幅と高さを DOM ノードの幅と高さ * ピクセル比に設定します。canvas.width = width * scaleBy;
        キャンバスの高さ = 高さ * スケール;
        // キャンバス CSS の幅と高さを DOM ノードの幅と高さに設定します。canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;
 
        // ブラシを取得します const context = canvas.getContext('2d');
 
        // 描画されたすべてのコンテンツをピクセル比で拡大縮小します context.scale(scaleBy, scaleBy);

3.

デバイスのピクセル比を取得したら、canavs.width と canvas.height にデバイスのピクセル比 (scaleBy) を掛けます。このとき、canvas.style.width と canvas.style.height を dom の幅と高さに設定します。なぜこのように書くのか考えてみましょう。最後に、描画するときに描画内容のピクセル比率を倍に拡大します。

たとえば、iPhone 6S のデバイスの幅と高さは 375 x 667 で、6S の window.devicePixelRatio = 物理ピクセル / ディップ (2 = 750 / 375) です。デザイナーが通常提供するデザインは 750 x 1334 ですか?

なので、ハイビジョンの画面で1:1の比率で描くとぼやけてしまいます。絵を見てください。6S DPR=2

6プラスDPR=3

4.

最後に、canvas.toDataURL("image/png"); を呼び出し、それを image.src に割り当てます。WeChat は写真を保存できないため、写真ファイルを生成し、WeChat に組み込まれている長押し機能を呼び出して写真をアルバムに保存することしかできません。

モバイル H5 で JavaScript を使用して画像を生成するソリューションに関するこの記事はこれで終わりです。モバイル H5 で JavaScript を使用して画像を生成することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • ネイティブjsが画像検証コードを生成する
  • jsはキャンバスを通じて画像のサムネイルを生成します
  • JavaはPhantomjsを使用して画像生成機能を実現します
  • Node.JSは純粋なJavaScriptを使用して画像やスライダーの検証コード機能を生成します
  • JSP ページで画像検証コードを動的に生成する方法の例
  • jsはキャンバスによって生成された画像を保存するか、直接画像を保存します
  • JSP開発における画像検証コード生成技術の詳細解説
  • captchapng モジュールを使用して Nodejs で画像検証コードを生成する
  • linnux+phantomjs をベースにした画像形式で Web ページのスナップショットを生成します

<<:  mysql5.7 以降で my.ini を設定するための詳細な手順

>>:  Linux で time(NULL) 関数と localtime() を使用して現在の時刻を取得する方法

推薦する

Alibaba Cloud ESC に MYSQL8.0 をインストールするチュートリアル

接続ツールを開きます。私はMobaXterm_Personal_12.1を使用します(公式サイトのダ...

Vue2.0でデータの双方向バインディング機能をjsを使って実装する

Object.definePropertyの理解文法:オブジェクト.defineProperty(o...

弾幕効果を実現するためのjQuery

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

Vue実装のカウンターケース

この記事では、カウンター表示を実現するためのVueの具体的なコードを例として紹介します。具体的な内容...

MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。

序文カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する...

Tomcat10 Catalinaのログの文字化けの問題を解決する

実行環境、Idea2020バージョン、Tomcat10、実行時にTomcat CatalinaLog...

MySQLの権限とインデックスの詳細な説明

mysql の権限とインデックスmysql の最高権限ユーザーは root です。 CREATE U...

Vue-CLI マルチページディレクトリパッケージ化手順の記録

ページディレクトリ構造 デフォルトの HTML テンプレート ファイル public/index.h...

Mysqlデータテーブルでワームレプリケーションを使用する方法

簡単に言えば、MySQL ワーム レプリケーションは、クエリされたデータを指定されたデータ テーブル...

Vueは動的に生成されたコンポーネントをドラッグアンドドロップする要件を実装します

目次製品要件アイデア問題ライブラリ選択をドラッグコンポーネントを生成する方法コンポーネントを生成する...

Vue ライフサイクルの紹介とフック関数の詳細な説明

目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...

HTMLバージョン宣言DOCTYPEタグ

通常のウェブサイトのソースコードを開くと、ソースコードは<!DOCTYPE htmlで始まる必...

MySQL マルチテーブルクエリの詳細な説明

いつも、気づかないうちに時間というのは驚くほど早く過ぎていきます。小暑が過ぎ、中暑に突入しました。太...

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...

Videojs+swiper が Taobao の商品詳細カルーセルを実現

この記事では、Taobao商品詳細のカルーセルを実現するためのvideojs+swiperの具体的な...