冒頭に書いた 以前、Renren で JS ベースのスクリーンショット ソリューションについて説明した共有を見たのを覚えています。詳細は覚えていませんが、非常に興味深く、キャンバスを使用しているようだったことを覚えています。そこで今回は、著者の考えを皆さんと共有するために、自分でも書いてみようと思います。これは単なる簡単なデモです。バグを見つけた場合は問題を報告してください。コードアドレスを投稿するには、規則に従ってください。 レンダリング 全体的なアイデア
1. 開始/終了ショートカットキーを設定する ショートカット キーは競合を引き起こす可能性があるため、最初はショートカット キーの数に制限がないことを望んでおり、配列を使用して最初のパラメーターでショートカット キーを渡します。 関数スクリーンショット(quickStartKey, EndKey) { //使用しないでください...拡張文字列 var keyLength = quickStartKey.length var isKeyTrigger = {} var cantStartShot = false ... quickStartKey.forEach(function(item) { //パラメータ配列を走査します isKeyTrigger[item] = false //デフォルト配列内のすべてのキーはトリガーされません}) $('html').on('keyup', 関数(e) { var キーコード = e.which if(keyCode === EndKey) { ... } そうでない場合(!ショットを開始できない場合) { isKeyTrigger[キーコード] = true var notTrigger = Object.keys(isKeyTrigger).filter(function(item) { return isKeyTrigger[item] === false // トリガーする必要があるショートカットキーがあるかどうかを確認します}) if(notTrigger.length === 0) { //スクリーンショットを開始するためにショートカットキーをトリガーする必要はありません cantStartShot = true beginShot(ショットを開始できない) } } }) 2. DOMをキャンバスに描画して、元のDOMインターフェースを覆う ネイティブ方式を使用する場合は、MDN のキャンバスで DOM を描画する方法の紹介を参照してください。難しいのは、<foreignObject> 要素に含まれる XML を含む SVG イメージを作成する必要があることです。現在のブラウザで表示されている DOM を計算して抽出する方法が、実は最も面倒です。実は、著者は = を手動で実装するための良いアイデアを持っていません。 =なので、これを実行するために html2canvas ライブラリを選択しました。一般的な呼び出し方法は次のとおりです。 関数beginShot(cantStartShot) { if(cantStartShot) { html2canvas(ドキュメント.body, { レンダリング時: function(canvas) { //インターフェースと一致するキャンバス画像を取得します} }) } } 3. マウスのスクリーンショット領域をシミュレートするキャンバスを追加する この部分の実装は、もともとネイティブのキャンバス API を使用する予定でしたが、マウスが押されてドラッグが開始された後、キャンバスをリアルタイムで描画する必要があるという問題がありました。これには、PS レイヤーに似た概念が必要です。マウスが移動するたびに、現在のスクリーンショット フレームが描画されますが、次にマウスが移動すると、前のスクリーンショット フレームが削除されます。これはリアルタイムの描画プロセスをシミュレートします。残念ながら、作者はキャンバスのネイティブ API を使用する方法を見つけていません。もしあるのであれば、描画したイメージにマークを付ける方法を教えてください。ここで著者は、Jcanvas と呼ばれる Jq ベースのキャンバス ライブラリを使用します。このライブラリはレイヤーの概念を提供します。つまり、レイヤーには 1 つの画像のみを描画でき、レイヤーには名前を付けることができます。これは著者のニーズを満たしており、次のように実装されています。 $('#' + canvasId).mousedown(function(e) { $("#"+canvasId).removeLayer(layerName) //前のレイヤーを削除する layerName += 1 startX = that._calculateXY(e).x //マウスの位置を計算します startY = that._calculateXY(e).y isShot = true $("#"+キャンバスID).addLayer({ タイプ: 'rectangle', //rectangle... name:layerName, //レイヤー名 x: startX, y: 開始Y、 幅: 1, 高さ: 1 }) }).mousemove(関数(e) { if(isShot) { $("#"+canvasId).removeLayer(レイヤー名) var moveX = that._calculateXY(e).x var moveY = that._calculateXY(e).y var 幅 = 移動X - 開始X var 高さ = 移動Y - 開始Y $("#"+キャンバスID).addLayer({ タイプ: '長方形'、 ... 名前:レイヤー名、 fromCenter: false、 x: 開始X、 y: 開始Y、 幅: 幅、 高さ: 高さ }) $("#"+canvasId).drawLayers(); //描画} }) 4. マウスのスクリーンショット領域に対応するブラウザインターフェースを描画するためのキャンバスを追加します。 var キャンバス結果 = document.getElementById('キャンバス結果') var ctx = canvasResult.getContext("2d"); ctx.drawImage(copyDomCanvas, moveX - startX > 0 ? startX : moveX, moveY - startY > 0 ? startY : moveY, width, height, 0, 0, width, height ) var dataURL = canvasResult.toDataURL("image/png"); 画像はdrawImageでキャプチャされ、toDataURLメソッドを使用して画像をbase64エンコードに変換します。 5. 撮影した画像を保存する 関数downloadFile(el, ファイル名, href){ el.attr({ 'ダウンロード':ファイル名、 'href': href }) } ... ダウンロードファイル($('.ok'), 'screenShot' + Math.random().toString().split('.')[1] || Math.random() + '.png', dataURL) // ボタンオブジェクト、画像を保存するためのランダムな名前、および base64 でエンコードされた画像を渡します a タグのダウンロード属性を使用し、ユーザーがクリックすると直接ダウンロードを実行できます。 展開する 依存関係 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/jcanvas/16.7.3/jcanvas.min.js"></script> <script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script> ショートカットキーを設定する screenShot([16, 65], 27) // 開始ショートカットキーはshift+a、終了キーはESC やっと 記事の一番嫌な部分(キャンバスへのDOM書き込み、キャンバス設定レイヤー)は、それぞれ2つのライブラリを使用して実装されています。今後、ネイティブAPIを使用してこれらの操作を実装する方法に焦点を当てていきますが、個人的には私の文章はまだ少し... 。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 |
<<: Eclipse は Tomcat を構成しますが、Tomcat には無効なポート解決策があります
1: mysql公式サイトからダウンロードhttps://dev.mysql.com/downlo...
目次1. ウェアハウスを使用してhttpd lrzsz解凍ファイルを作成する2. ソースコードファイ...
シングルノードデータベースの欠点大規模なインターネットプログラムはユーザーベースが大きいため、アーキ...
序文導入Lombok は、Google Guava と同様に便利なツールであり、強くお勧めします。す...
リストは、類似または関連する一連の項目をリストするために使用されます。順序なしリスト(箇条書きリスト...
目次導入ログ分類パラメータファイルエラーログファイル完全なログファイルスロークエリログバイナリログフ...
この記事では、MySQL を使用してデータを Excel にエクスポートする方法について説明します。...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
この記事では、MySQL 5.7.24のインストールと設定のチュートリアルを参考までに紹介します。具...
序文負荷分散には nginx を使用します。アーキテクチャのフロントエンドまたは中間層として、トラフ...
jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...
背景このバグは滾動條占據空間ことで発生していました。いくつかの情報を確認して、ようやく解決しました。...
clip-path CSS プロパティはクリッピングを使用して要素の表示可能領域を作成します。領域内...
目次序文1. マルチレベルのデータとイベントの配信には$attrsと$listenersを使用する2...
この記事では、Web ページ制作を学ぶ過程で習得すべきテクニックの一部を詳しく紹介します。これらの内...