この記事では、キャンバスを使用して画像圧縮アップロードを実現するVueの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。 シナリオ:ユーザーアバターなど 大きなサイズの画像をアップロードする場合、フロントエンドで圧縮するとトラフィックが節約されるだけでなく、ユーザーエクスペリエンスも大幅に向上します。 2つの側面: 1.アップロードされる画像のサイズが比較的小さいため、アップロード速度が速くなり、やり取りがスムーズになります。同時に、ネットワーク異常によるアップロード失敗のリスクが大幅に軽減されます。 例: 主な技術: canvasのdrawImage()メソッドを使用します。 (付録: canvas.toDataURL() または canvas.toBlob()) ctx.drawImage(画像、dx、dy); ctx.drawImage(画像、dx、dy、dWidth、dHeight); ctx.drawImage(イメージ、sx、sy、sWidth、sHeight、dx、dy、dWidth、dHeight); 例: //html <input id="ファイル" type="ファイル"> // JS var eleFile = document.querySelector('#file'); // 画像を圧縮するために必要ないくつかの要素とオブジェクト var reader = new FileReader(), img = new Image(); //選択されたファイルオブジェクト var file = null; //画像に必要なキャンバスの拡大縮小 var キャンバス = document.createElement('キャンバス'); var コンテキスト = canvas.getContext('2d'); // base64アドレスイメージがロードされた後、img.onload = function () { //画像の元のサイズ var originWidth = this.width; var originHeight = this.height; // 最大サイズ制限 var maxWidth = 400, maxHeight = 400; // ターゲット サイズ var targetWidth = originWidth, targetHeight = originHeight; // 画像サイズが400x400の制限を超えています if (originWidth > maxWidth || originHeight > maxHeight) { (原点の幅 / 原点の高さ > 最大幅 / 最大高さ)の場合 { // 幅が広くなるため、幅に応じてサイズを制限します。targetWidth = maxWidth; ターゲット高さ = Math.round(最大幅 * (原点高さ / 原点幅)); } それ以外 { ターゲット高さ = 最大高さ; ターゲット幅 = Math.round(最大高さ * (原点幅 / 原点高さ)); } } // キャンバスは画像を拡大縮小します。canvas.width = targetWidth; キャンバスの高さ = ターゲットの高さ; // キャンバスをクリアします context.clearRect(0, 0, targetWidth, targetHeight); // 画像圧縮 context.drawImage(img, 0, 0, targetWidth, targetHeight); // キャンバスをblobに変換してアップロードします canvas.toBlob(function (blob) { // 画像の Ajax アップロード var xhr = new XMLHttpRequest(); // ファイルのアップロードが成功しました xhr.onreadystatechange = function() { (xhr.status == 200)の場合{ // xhr.responseText は返されるデータです} }; // アップロードを開始します xhr.open("POST", 'upload.php', true); xhr.send(blob); }, ファイルタイプ || 'image/png'); }; // ファイルをbase64に変換して画像の元のサイズを取得します。reader.onload = function(e) { img.src = e.target.result; }; eleFile.addEventListener('change', 関数(イベント) { ファイル = event.target.files[0]; // 選択されたファイルは画像です if (file.type.indexOf("image") == 0) { reader.readAsDataURL(ファイル); } }); 知らせ: モバイル側では画像が歪んでしまいます。デバイスの DPR に合わせてキャンバスを拡大し、CSS を使用して強制的に復元する必要があります。 // デバイスの dpr を取得 getPixelRatio: 関数(コンテキスト) { backingStore を context.backingStorePixelRatio とします。 context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || コンテキスト.msBackingStorePixelRatio || コンテキスト.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; (window.devicePixelRatio || 1) / backingStore を返します。 } // 次のようになります const ctx = this.canvas.getContext("2d"); const dpr = this.getPixelRatio(ctx); this.$refs.postImg.crossOrigin = "匿名"; var oldWidth = this.canvas.width; var oldHeight = this.canvas.height; this.canvas.style.width = oldWidth + 'px'; this.canvas.style.height = oldHeight + 'px'; this.canvas.width = oldWidth * dpr; this.canvas.height = oldHeight * dpr; ctx.scale(dpr, dpr); //通常の操作を実行します ctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400); 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Ubuntu 20.04 オペレーティング システムの VMware インストール チュートリアル図
>>: Windows 10 で Ubuntu 20.04 LTS をアップデートする方法
目次Nginx 負荷分散構成Nginx 負荷分散戦略ポーリング(デフォルト)重さip_ハッシュ公正(...
テーブルを美しくするために、テーブルにさまざまな境界線の色を設定できます。基本的な構文<テーブ...
HTML では、<img> タグはテキスト内の画像タグを定義するために使用されます。その...
この記事の例では、ページング機能を実装するためのVueの具体的なコードを参考までに共有しています。具...
Ubuntuの最新バージョンでは、ユーザーは中国語入力方法を別途ダウンロードする必要がなくなりました...
目次01 sql_slave_skip_counter パラメータ02 スレーブスキップエラーパラメ...
1. ダウンロードダウンロードアドレス: https://dev.mysql.com/get/Dow...
Sttty は、Linux で端末設定を変更および印刷するための一般的なコマンドです。 1. パラ...
1. Dockerはローカルイメージをインポートする場合によっては、イメージをローカルまたは別の友人...
なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...
初回の読み込みを高速化できるルートの遅延読み込みをどうして忘れられるでしょうか?ルーティングの遅延読...
方法1: Pycharmをダウンロードしてインストールするダウンロードアドレス: https://w...
参考までに、Javascriptを使用してメッセージボードの例(メッセージ削除あり)を実装します。具...
2005年に業界に入ってから数か月後、労働者の日休みの期間中、1か月以上毎日12時まで残業をしました...
導入データベースに接続するためにJDBCを使用することに慣れている場合は、データベースに接続するため...