Vue implementiert das Hinzufügen von Wasserzeichen zu hochgeladenen Bildern

Vue implementiert das Hinzufügen von Wasserzeichen zu hochgeladenen Bildern

In diesem Artikel wird der spezifische Implementierungscode zum Hinzufügen von Wasserzeichen zu hochgeladenen Bildern in Vue zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

1. Kapselungs- und Wasserzeichenmethode

/**
 * Wasserzeichen hinzufügen * @param {blob} Datei
 * @param {string} el
 * @returns {Versprechen}
 */
exportiere asynchrone Funktion addWaterMarker(Datei, el = '#markImg') {
  returniere neues Promise(async (auflösen, ablehnen) => {
    versuchen {
      // Komprimieren und drehen Sie das Bild zuerst file = warte auf compressor(file)
      // Konvertiere den Datei-Blob in ein Bild let img = await blobToImg(file)

      //Eine Leinwand erstellen let canvas = document.createElement('canvas')
      canvas.width = img.natürlicheBreite
      Leinwandhöhe = Bild.natürliche Höhe
      lass ctx = canvas.getContext('2d')

      // Das hochgeladene Bild füllen ctx.drawImage(img, 0, 0, canvas.width, canvas.height)

      // Wasserzeichenbild generieren const markEle = document.querySelector(el)
      const markWidth = markEle.clientWidth
      const scale = Leinwandbreite * 0,25 / Markierungsbreite
      // Skalieren Sie zuerst das Wasserzeichen und konvertieren Sie es dann in ein Bild markEle.style.transform = `scale(${scale})`
      const markImg = warte auf htmlToCanvas(markEle).

      // Wasserzeichen füllen ctx.drawImage(markImg, canvas.width – markImg.width – 15 * scale, canvas.height – markImg.height – 15 * scale, markImg.width, markImg.height)

      //Leinwand in Blob umwandeln
      canvas.toBlob(Blob => auflösen(Blob))
    } Fehler abfangen {
      ablehnen(Fehler)
    }

  })
}

Funktion blobToImg(blob) {
  returniere neues Promise((lösen, ablehnen) => {
    let reader = neuer FileReader()
    reader.addEventListener('laden', () => {
      let img = neues Bild()
      img.src = Leser.Ergebnis
      img.addEventListener('laden', () => auflösen(img))
    })
    Leser.readAsDataURL(blob)
  })
}


Exportfunktion htmlToCanvas(el, Hintergrundfarbe = 'rgba(0,0,0,.1)') {
  returniere neues Promise(async (auflösen, ablehnen) => {
    versuchen {
      const markImg = warte auf html2canvas(el, {
        scale: 2, //Der Standardwert window.devicePixelRatio wird hier nicht verwendet, er muss mit dem mobilen Ende übereinstimmen allowTaint: false, //Verschmutzung zulassen useCORS: true,
        backgroundColor //'transparent' //Hintergrundfarbe})
      auflösen(markImg)
    } Fehler abfangen {
      ablehnen(Fehler)
    }
  })
}

/**
 * Bilder komprimieren und drehen * @param {blob} Datei
 * @param {number} Qualitätskomprimierungsverhältnis * @param {number} maxWidth
 * @returns {Versprechen}
 */
Exportfunktion Kompressor (Datei, Qualität = 0,6, max. Breite = 750) {
  gib ein neues Versprechen zurück (Auflösen => {
    neuer Kompressor (Datei, {
      maxBreite,
      Qualität,
      Erfolg: Entschlossenheit,
      Fehler(Fehler) {
        console.log(Fehlermeldung)
      }
    })
  })
}

2. Einsatz im Projekt

<!-- Bild hochladen-->
<div Klasse="flex mt20" v-if="item.questionType === 4">
  <van-uploader
    v-Modell="item.imgUpload"
    mehrere="true"
    verzögertes Laden
    :deletetable="!istDeaktiviert"
    :disabled="istDeaktiviert"
    @delete="handleDeleteImg({ ...Argumente, Element })"
    :before-read="Handle vor Bildupload"
    :nachher-lesen="handleAfterImgUpload"
    @click.native="aktuellesItem = Artikel"
  />
</div>
    
<Skript>
importieren {
  getTaskDetail,
  BenutzerAusführen,
  SendenFlow,
  ablehnenFlow,
} von '@/api/myTask';

importiere { uploadOSS } von '@/utils/oss';
importiere { parseTime, addWaterMarker } aus '@/utils';

importiere { ImagePreview } von 'vant';

Compressor von „compressorjs“ importieren;

const fileExtensions = ['xlsx', 'xls', 'docx', 'doc', 'pdf'];

const quality = 0.2; //Bildkomprimierungsqualität export default {
  Methoden: {
  // Vor dem Hochladen async handleBeforeImgUpload(img, detail) {
      wenn (!img) {
        zurückkehren
      }
      returniere neues Promise(async (auflösen, ablehnen) => {
        wenn (Array.isArray(img)) {
          wenn (Bildlänge > 5) {
            this.$toast('Laden Sie bis zu 5 Fotos gleichzeitig hoch, bitte laden Sie sie in Stapeln hoch!')
            ablehnen()
          }
          lass Blobs = []
          für (const-Datei von img) {
            // Bilder, die größer als 512 KB sind, werden zuerst komprimiert, wenn (Dateigröße > 512 * 1024 und file.type.includes('image/')) {
              Datei = warte auf this.compressor(Datei)
            }
            // Wasserzeichen hinzufügen let blob = await addWaterMarker(file)
            blob.name = datei.name
            blobs.push(blob)
          }
          auflösen (Blobs)
        } anders {
          // Bilder, die größer als 512 KB sind, sollten zuerst komprimiert werden, wenn (Bildgröße > 512 * 1024 && img.type.includes('image/')) {
            img = warte auf dies.compressor(img)
          }
          const blob = warte auf addWaterMarker(img).
          blob.name = img.name
          auflösen (Blob)
        }
      })
    },
    
    //Nach dem Hochladen async handleAfterImgUpload(img, detail) {
      versuchen {
        $wird geladen.anzeigen()
        wenn (Array.isArray(img)) {
          img.forEach(async ({ Datei }, Index) => {
            wenn (!Dateiname || !Dateityp.includes('Bild/')) {
              dies.currentItem.imgUpload.splice(detail.index + index, 1)
              this.$toast('Upload fehlgeschlagen, es können nur Fotos hochgeladen werden!')
              // Hochladen abgeschlossen, wenn (Index === Bildlänge - 1) {
                $wird geladen.ausblenden()
              }
              return //return in forEach entspricht continue
            }
            if (Dateigröße > 1024 * 1024 * 10) {
              dies.currentItem.imgUpload.splice(detail.index + index, 1)
              this.$toast('Die Datei ist zu groß, eine einzelne Datei darf nicht größer als 10 MB sein!')
              // Hochladen abgeschlossen, wenn (Index === Bildlänge - 1) {
                $wird geladen.ausblenden()
              }
              zurückkehren
            }
            versuchen {
              const { Dateiname, URL } = warte auf UploadOSS(Datei)
              dies.currentItem.answer.push({
                URL (URL = URL = URL),
              })
            } Fehler abfangen {
              dies.currentItem.imgUpload.splice(detail.index + index, 1)
              this.$toast('Hochladen fehlgeschlagen, bitte versuchen Sie es später noch einmal!')
              Konsole.Fehler(Fehler)
            }
            // Hochladen abgeschlossen, wenn (Index === Bildlänge - 1) {
              $wird geladen.ausblenden()
            }
          })
        } anders {
          wenn (!img.file.type.includes('image')) {
            dies.currentItem.imgUpload.splice(detail.index, 1)
            $wird geladen.ausblenden()
            this.$toast('Upload fehlgeschlagen, es können nur Fotos hochgeladen werden!')
            zurückkehren
          }
          wenn (Bilddateigröße >= 1024 * 1024 * 10) {
            dies.currentItem.imgUpload.splice(detail.index, 1)
            $wird geladen.ausblenden()
            this.$toast('Die Datei ist zu groß und darf 10 MB nicht überschreiten!')
            zurückkehren
          }
          // Wenn es größer als 512 KB ist, komprimieren Sie es zuerst. let file = img.file
          const { Dateiname, URL } = warte auf UploadOSS(Datei)
          dies.currentItem.answer.push({
            URL (URL = URL = URL),
          })
          $wird geladen.ausblenden()
        }
      } Fehler abfangen {
        dies.currentItem.imgUpload.splice(detail.index, 1)
        $wird geladen.ausblenden()
        this.$toast('Hochladen fehlgeschlagen, bitte versuchen Sie es später noch einmal!')
        Konsole.Fehler(Fehler)
      }
    }
 }

Danke an Bruder Long für seine Führung;

3. Die Auswirkungen sind wie folgt

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:
  • So verwenden Sie Bilder und Bildwasserzeichen mit versteckten Textinformationen in Vue
  • Vue implementiert das Hinzufügen eines Wasserzeicheneffekts zur Seite
  • Vue integriert PDF.js, um eine PDF-Vorschau zu implementieren und Schritte zum Hinzufügen von Wasserzeichen durchzuführen
  • Vue implementiert die Seitenwasserzeichenfunktion
  • Drei Möglichkeiten zum Hochladen von Bildern mit Vue
  • Der Uploader von Vue+Vant auf dem mobilen Endgerät realisiert die Funktionen des Hochladens, Komprimierens und Drehens von Bildern
  • Vue+elementUI implementiert ein Beispiel für eine Formular- und Bild-Upload- und Überprüfungsfunktion
  • vue + elementUI realisiert die Bild-Upload-Funktion
  • Basierend auf VUE Bilder auswählen, hochladen und auf der Seite anzeigen (Bilder können gelöscht werden)
  • Vue ermöglicht das Hinzufügen von Wasserzeichen zu hochgeladenen Bildern (aktualisierte Version)

<<:  Einführung in die Verwendung der vier wichtigsten SQL-Rankingfunktionen ROW_NUMBER, RANK, DENSE_RANK, NTILE

>>:  Lösen Sie schnell das Problem der chinesischen Eingabemethode unter Linux

Artikel empfehlen

So schreiben Sie asynchrone Aufgaben in modernem JavaScript

Vorwort In diesem Artikel untersuchen wir die Ent...

Beispiel für einen SQL-Seriennummernerfassungscode

In diesem Artikel wird hauptsächlich das Beispiel...

Eine Codezeile löst verschiedene IE-Kompatibilitätsprobleme (IE6-IE10)

x-ua-compatible wird verwendet, um das Modell für...

Zusammenfassung des fragmentierten Wissens zum Docker-Management

Inhaltsverzeichnis 1. Übersicht 2. Anwendungsbeis...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.5.27 winx64

1. Installationspaket MySQL-Dienst-Downloadadress...

Verwendung von MySQL DDL-Anweisungen

Vorwort Die Sprachklassifikation von SQL umfasst ...

Tutorial zur HTML-Tabellenauszeichnung (37): Hintergrundbild-Attribut BACKGROUND

Legen Sie das Hintergrundbild für die Tabellenübe...

HTML-Elemente (Tags) und ihre Verwendung

a : Gibt die Start- oder Zielposition eines Hyper...

So stellen Sie eine Nextcloud-Netzwerkfestplatte mit Docker bereit

NextCloud Sie können beliebige Dateien oder Ordne...

JavaScript zum Erreichen eines einfachen Seiten-Countdowns

In diesem Artikelbeispiel wird der spezifische Ja...

Einführung und Installation von MySQL Shell

Inhaltsverzeichnis 01 ReplicaSet-Architektur 02 E...