Vue verwendet Canvas, um den Bildkomprimierungs-Upload zu realisieren

Vue verwendet Canvas, um den Bildkomprimierungs-Upload zu realisieren

In diesem Artikel wird der spezifische Code von Vue, der Canvas verwendet, um das Hochladen von Bildkomprimierungen zu Ihrer Information zu erreichen, geteilt. Der spezifische Inhalt ist wie folgt

Szenario: wie Benutzeravatar usw.

Beim Hochladen großformatiger Bilder spart die Komprimierung im Frontend nicht nur Datenverkehr, sondern verbessert auch das Benutzererlebnis erheblich.

Zwei Aspekte:

1. Da die hochgeladene Bildgröße relativ klein ist, ist die Upload-Geschwindigkeit höher und die Interaktion reibungsloser. Gleichzeitig wird das Risiko eines Upload-Fehlers aufgrund von Netzwerkanomalien erheblich reduziert.
2. Die Bild-Upload-Funktion vieler Websites begrenzt die Größe von Bildern, insbesondere von Avatar-Uploads. Es ist sehr üblich, sie auf 5 MB oder 2 MB zu begrenzen (aber ich habe einen Avatar mit einer SLR aufgenommen, daher ist es normal, dass das Foto 2 MB überschreitet und das Bild verarbeitet werden muss, bevor es hochgeladen werden kann). Wenn die Komprimierung am Frontend durchgeführt werden kann, besteht theoretisch keine Notwendigkeit, die Bildgröße zu begrenzen.

Beispiel:

Haupttechnologie: Verwenden Sie die drawImage()- Methode von Canvas . (Anhang: canvas.toDataURL() oder canvas.toBlob())

ctx.drawImage(Bild, dx, dy);
ctx.drawImage(Bild, dx, dy, dBreite, dHöhe);
ctx.drawImage(Bild, sx, sy, sBreite, sHöhe, dx, dy, dBreite, dHöhe);

Beispiel:

//html
<input id="Datei" Typ="Datei">

// JS
var eleFile = document.querySelector('#Datei');

//Einige Elemente und Objekte, die zum Komprimieren von Bildern benötigt werden var reader = new FileReader(), img = new Image();

//Ausgewähltes Dateiobjekt var file = null;

//Skalierung der für das Bild erforderlichen Leinwand
var Leinwand = Dokument.createElement('Leinwand');
var Kontext = Canvas.getContext('2d');

// Nachdem das Base64-Adressbild geladen wurde, img.onload = function () {
    //Originalgröße des Bildes var originWidth = this.width;
    var originHeight = diese.Höhe;
    // Maximale Größenbeschränkung var maxWidth = 400, maxHeight = 400;
    // Zielgröße var targetWidth = originWidth, targetHeight = originHeight;
    // Die Bildgröße überschreitet das Limit von 400x400 if (originWidth > maxWidth || originHeight > maxHeight) {
        wenn (Ursprungsbreite / Ursprungshöhe > max.Breite / max.Höhe) {
            // Breiter, begrenze die Größe entsprechend der Breite targetWidth = maxWidth;
            Zielhöhe = Math.round(maximale Breite * (Ursprungshöhe / Ursprungsbreite));
        } anders {
            Zielhöhe = max. Höhe;
            Zielbreite = Math.round(max.Höhe * (Ursprungsbreite / Ursprungshöhe));
        }
    }
        
    // Canvas skaliert das Bild canvas.width = targetWidth;
    canvas.height = Zielhöhe;
    //Leinwand löschen context.clearRect(0, 0, targetWidth, targetHeight);
    // Bildkomprimierung context.drawImage(img, 0, 0, targetWidth, targetHeight);
    // Canvas in Blob umwandeln und hochladen canvas.toBlob(function (blob) {
        // Ajax-Upload von Bildern var xhr = new XMLHttpRequest();
        // Datei-Upload erfolgreich xhr.onreadystatechange = function() {
            wenn (xhr.status == 200) {
                // xhr.responseText sind die zurückgegebenen Daten}
        };
        // Starten Sie den Upload xhr.open("POST", 'upload.php', true);
        xhr.send(blob);    
    }, Dateityp || 'image/png');
};

//Konvertiere die Datei in Base64, um die Originalgröße des Bildes zu erhalten reader.onload = function(e) {
    img.src = e.Ziel.Ergebnis;
};
eleFile.addEventListener('ändern', Funktion (Ereignis) {
    Datei = Ereignis.Ziel.Dateien[0];
    // Die ausgewählte Datei ist ein Bild if (file.type.indexOf("image") == 0) {
        reader.readAsDataURL(Datei);    
    }
});

Beachten:

Das Bild wird auf der mobilen Seite verzerrt. Sie müssen die Leinwand entsprechend dem DPR des Geräts vergrößern und dann CSS verwenden, um die Wiederherstellung zu erzwingen.

// Gerät-DPR abrufen
getPixelRatio: Funktion (Kontext) {
    let backingStore = context.backingStorePixelRatio ||
    Kontext.webkitBackingStorePixelRatio ||
    Kontext.mozBackingStorePixelRatio ||
    Kontext.msBackingStorePixelRatio ||
    Kontext.oBackingStorePixelRatio ||
    Kontext.backingStorePixelRatio || 1;
    Rückgabewert (window.devicePixelRatio || 1) / backingStore;
}

// so etwas wie das hier const ctx = this.canvas.getContext("2d");
const dpr = this.getPixelRatio(ctx);
this.$refs.postImg.crossOrigin = "Anonym";
var alteWidth = this.canvas.width;
var alteHeight = this.canvas.height;
this.canvas.style.width = alteBreite + 'px'; 
this.canvas.style.height = alteHöhe + 'px';
this.canvas.width = alteBreite * dpr;
this.canvas.height = alteHöhe * dpr;
ctx.scale(dpr, dpr);

//Normale Vorgänge ausführen ctx.drawImage(this.$refs.cropImg, 0, 0, 250, 400);

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Vue verwendet Canvas, um Kreise zufälliger Größe und ohne Überlappung zu erzeugen
  • So zeichnen Sie die Zeitleiste mit Vue+Canvas
  • VUE+Canvas realisiert den gesamten Prozess eines einfachen Gobang-Spiels
  • VUE+Canvas implementiert das Spiel God of Wealth und erhält Barren
  • So verwenden Sie VUE und Canvas, um ein Thunder Fighter-Tippspiel zu implementieren
  • VUE+Canvas implementiert den Beispielcode des Desktop-Flipper-Brick-Breaking-Spiels
  • Vue verwendet die Maus, um ein Rechteck auf Canvas zu zeichnen
  • Vue nutzt Canvas zur Implementierung mobiler handschriftlicher Signaturen
  • Vue+Canvas realisiert Puzzlespiel
  • Vue verwendet Canvas-Handschrifteingabe, um Chinesisch zu erkennen

<<:  Beispiel für eine MySQL-DML-Sprachoperation

>>:  Tutorial-Diagramm zur VMware-Installation des Ubuntu 20.04-Betriebssystems

Artikel empfehlen

Einführung in die MySQL-Optimierung für die Unternehmensproduktion

Im Vergleich zu anderen großen Datenbanken wie Or...

So verwenden Sie js, um festzustellen, ob eine Datei UTF-8-codiert ist

Konventionelle Lösung Verwenden Sie FileReader, u...

So stellen Sie MySQL- und Redis-Dienste mit Docker bereit

Inhaltsverzeichnis So stellen Sie den MySQL-Diens...

So finden Sie langsame SQL-Anweisungen in MySQL

Wie finde ich langsame SQL-Anweisungen in MySQL? ...

Eine kurze Diskussion über Tags in HTML

0. Was ist ein Tag? XML/HTML-CodeInhalt in die Zw...

Installations-Tutorial zur dekomprimierten Version von MySQL5.7.21 unter Win10

Installieren Sie die entpackte Version von Mysql ...

Prozessdiagramm für die Ideenbereitstellung und Tomcat-Dienstimplementierung

Konfigurieren Sie zunächst die Projektartefakte K...

Interpretation des CocosCreator-Quellcodes: Engine-Start und Hauptschleife

Inhaltsverzeichnis Vorwort Vorbereitung Gehen! Te...