Vueはキャンバスを使用して画像圧縮アップロードを実現します

Vueはキャンバスを使用して画像圧縮アップロードを実現します

この記事では、キャンバスを使用して画像圧縮アップロードを実現するVueの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

シナリオ:ユーザーアバターなど

大きなサイズの画像をアップロードする場合、フロントエンドで圧縮するとトラフィックが節約されるだけでなく、ユーザーエクスペリエンスも大幅に向上します。

2つの側面:

1.アップロードされる画像のサイズが比較的小さいため、アップロード速度が速くなり、やり取りがスムーズになります。同時に、ネットワーク異常によるアップロード失敗のリスクが大幅に軽減されます。
2. 多くのウェブサイトの画像アップロード機能では、画像、特にアバターのアップロードのサイズに制限があります。5Mまたは2Mに制限するのが一般的です(ただし、アバターは一眼レフで撮影したので、写真が2Mを超えるのは普通であり、アップロードする前に画像を処理する必要があります)。フロントエンドで圧縮が実行できる場合、理論的には画像サイズを制限する必要はありません。

例:

主な技術: canvasdrawImage()メソッドを使用します。 (付録: 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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • VueはCanvasを使用してランダムなサイズで重なり合わない円を生成します
  • vue+canvasでタイムラインを描く方法
  • VUE+CanvasはシンプルなGobangゲームの全プロセスを実現します
  • VUE+Canvasは、インゴットを受け取る富の神のゲームを実装します
  • VUE と Canvas を使用して Thunder Fighter タイピング ゲームを実装する方法
  • VUE+Canvasはデスクトップピンボールブロック破壊ゲームのサンプルコードを実装します
  • Vueはマウスを使ってキャンバス上に四角形を描きます
  • Vueはキャンバスを使用してモバイル手書き署名を実装します
  • Vue+canvasでパズルゲームを実現
  • Vueはキャンバスの手書き入力を使用して中国語を認識します

<<:  Ubuntu 20.04 オペレーティング システムの VMware インストール チュートリアル図

>>:  Windows 10 で Ubuntu 20.04 LTS をアップデートする方法

推薦する

nodejsとyarnをインストールし、Taobaoソースプロセスレコードを構成する

目次1. nodejsをダウンロードする2. ダブルクリックしてインストール3. グローバル npm...

CentOS 8 インストール図 (超詳細なチュートリアル)

CentOS 8 が正式にリリースされました! CentOS は Red Hat の再配布ポリシー...

JavaScript エラー処理 try..catch...finally + は throw+TypeError+RangeError をカバーします

目次1. 目的2. 文法3. 練習する1. 目的通常、エラーが発生すると、スクリプトは直ちに停止し、...

Nginx設定の原理と実装プロセスの詳細な説明https

Linuxユーティリティcertbotを使用してhttps証明書を生成するこのツールは Let&#...

Adobe Brackets の簡単な使い方のグラフィックチュートリアル

Adobe Brackets は、HTML、CSS、JavaScript 用のオープンソースでシンプ...

HTMLページの読み込み速度を上げる方法

(1)HTTPリクエストを減らす。 (リソース ファイルをマージし、イメージ スプライトを使用します...

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

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

MySQLテーブルのテーブル構造を素早く変更する方法

MySQL テーブルのテーブル構造をすばやく変更する - 「MySQL 管理」から抜粋 ALTER ...

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

目次1. ジョブ実行のフォールトトレランス1.1 タスクフェイルオーバー戦略1.2 ジョブ再開戦略2...

ウェブサイト上で flv/MP4 やその他のビデオ ファイルを再生できない問題は、MIME タイプに関連しています。

ウェブサイトを作成している際に、flv や MP4 形式などのビデオ ファイルはローカルでは正常に再...

GolangでMySQLデータベースを操作するための実装コード

序文Golang は、SQL データベースにアクセスするための database/sql パッケージ...

Windows 10 1903 エラー 0xc0000135 の解決方法 [推奨]

Windows 10 1903 は、2019 年に Microsoft がリリースした Windo...

formData 形式タイプを使用してファイルをアップロードする Vue の例

Vue では、一般的にフロントエンドとバックエンドを分離したプロジェクトがあり、データ操作を実装する...

継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

背景アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースす...

js SMS認証コード入力ボックスを手動で実装する

序文この記事では、私が手動で実装したフロントエンドの一般的な SMS 認証コード入力コンポーネントと...