„Seiten-Screenshot“ ist eine Anforderung, die häufig im Front-End auftritt, z. B. bei der Generierung von Seitenpostern oder beim Teilen von Popup-Bildern. Da der Browser keine native Screenshot-API besitzt, muss zum Exportieren von Bildern Canvas verwendet werden, um die Anforderungen zu erfüllen. Durchführbarkeit
LösungsauswahlLösung 1: Sie müssen den berechneten Stil jedes DOM-Elements manuell berechnen und dann die Größe, Position und andere Attribute des Elements auf der Leinwand berechnen. Schwierigkeit der Lösung 1
Lösung 2: Das Projekt hat mehr als 20.000 Sterne auf Github und der Autor pflegt es immer noch aktiv. Die API ist sehr einfach und kann sofort in bestehenden Projekten verwendet werden. html2canvasDa es sich um eine allgemeine Nachfrage handelt, verfügt die Community über ausgereifte Lösungen. Probieren Sie zuerst die Lösungen der Community aus. <div id="capture" style="padding: 10px; Hintergrund: #f5da55"> <h4 style="color: #000; ">Hallo Welt!</h4> </div> html2canvas(document.querySelector("#capture")).dann(canvas => { Dokument.Body.AnhängenUntergeordnetesElement(Canvas) }); Das Obige ist die Beispielverwendung der offiziellen Website. Auf der Webseite wird ein neues Canvas-DOM angezeigt. Als nächstes müssen wir nur noch die Leinwand in ein Bild umwandeln. Hier verwenden wir die nativen toDataURL- und toBlob-Methoden von Canvas, um zur Qiniu Cloud zu gelangen. Bitte seien Sie bei der Verwendung vorsichtig. Wenn die erstellte Leinwand domänenübergreifende Bilder enthält, müssen Sie „allowTaint“ auf „true“ konfigurieren. Wenn es sich um eine native Canvas-Implementierung handelt, müssen vor dem Zeichnen alle domänenübergreifenden Bildanforderungen des Canvas abgeschlossen werden. Es gibt zwei Lösungen
Funktion asyncImage(url) { const img = neues Bild(); img.src = URL; img.setAttribute('crossOrigin', 'anonymous'); returniere neues Promise((lösen, ablehnen) => { img.onload = () => auflösen(img); img.onerror = ablehnen; }); } OK, wir sind fertig. Können wir jetzt die Anforderungen liefern? Den Test habe ich gerne abgelegt, allerdings musste ich bei der Durchführung des Tests auf dem mobilen Endgerät feststellen, dass die erzeugten Bilder sehr unscharf waren. Das wird nicht funktionieren, es ist offensichtlich viel niedriger (es hat den Test nicht bestanden, orz). GitHub hat ein entsprechendes Lösungsportal, diese Antwort löst auch die Probleme vieler Leute Grundprinzip: Breite und Höhe der Leinwand verdoppeln. Verwenden Sie CSS, um den Canvas-Stil auf die einfache Größe einzustellen. var shareContent = IhrZielelement; var Breite = ShareContent.OffsetWidth; var Höhe = ShareContent.OffsetHeight; var Leinwand = Dokument.createElement("Leinwand"); var scale = 2 || window.devicePixelRatio; //Sie können auch das Gerätepixelverhältnis verwenden canvas.width = width * scale; canvas.height = Höhe * Maßstab; canvas.getContext("2d").scale(scale, scale); var opts = { Maßstab: Maßstab, Leinwand: Leinwand, Protokollierung: wahr, Breite: Breite, Höhe: Höhe }; html2canvas(shareContent, opts).then(Funktion (Canvas) { var Kontext = Canvas.getContext('2d'); var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height); Dokument.body.appendChild(img); $(img).css({ "Breite": Leinwandbreite / 2 + "px", "Höhe": Leinwandhöhe / 2 + "px", }) }); Das Prinzip ist uns bereits bekannt und tatsächlich ist das Bild nach der tatsächlichen Anwendung viel klarer. Aber das Problem ist noch immer nicht gelöst. Obwohl eine Verkleinerung die Übersichtlichkeit verbessert, muss das Bild dennoch in Originalgröße vorliegen. . Nach vielen erfolglosen Versuchen habe ich mich schließlich dazu entschlossen, die Nutzung des Frameworks aufzugeben. Verwenden Sie einfach die native Leinwand, um eines zu erstellen! LeinwandzeichnungWir wissen, dass auf Geräten mit hochauflösenden Bildschirmen alle auf die Leinwand gezeichneten Bilder, Texte, Linien und Formen verschwommen erscheinen können. Dies kann durch die Einführung von hidpi-canvas von GitHub effektiv gelöst werden.
Der Kerncode lautet wie folgt Funktion asyncImage(url) { const img = neues Bild(); img.src = URL; img.setAttribute('crossOrigin', 'anonymous'); returniere neues Promise((lösen, ablehnen) => { img.onload = () => auflösen(img); img.onerror = ablehnen; }); } asynchrone Funktion drawCanvas(){ var canvas = document.querySelector('canvas'); var Kontext = Canvas.getContext('2d'); var ratio = getPixelRatio(context); // Schlüsselcode canvas.width = 300 * ratio; // Leinwandbreite canvas.height = 300 * ratio; // Leinwandhöhe var divWidth = 300 * ratio; // Wird verwendet, um den Inhalt zu zentrieren var divHeight = 300 * ratio; // Wird verwendet, um den Inhalt zu zentrieren const image = await asyncImage('picUrl') const imgWidth = 550 const imgHeight = 300 Kontext.drawImage(dieses, 50, 50, Bildbreite * Verhältnis, Bildhöhe * Verhältnis) // Ein anderer Code const Blob = canvas.toBlob((Blob)=>{ //In die Qiniu-Cloud hochladen}); } Das endgültig generierte Bild ist endlich klar … es muss sich nur entsprechend der Offsetbreite des DOM an verschiedene Bildschirme anpassen. Zusammenfassen Wenn keine hohen Anforderungen an die Bildschärfe gestellt werden oder die Bildanforderung darin besteht, eine Miniaturansicht zu erstellen. Die Verwendung von html2canvas ist eine sehr gute Wahl. Dies ist das Ende dieses Artikels über die Implementierung der Seiten-Screenshot-Funktion mit JS. Weitere relevante Inhalte zur JS-Seiten-Screenshot-Funktion finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: VMware Workstation-Installation (Linux-Kernel) Kylin-Grafik-Tutorial
>>: Lösungen für MySql-Abstürze und Dienststartfehler
Effektive Lösung für Ubuntu, wenn in einer virtue...
Durchführung von Prozessanalysen (1) Wie rufe ich...
Verwenden Sie einen JS-Timer, um ein Element zu e...
Problem: vue-cil3 wird mit Warnungen ausgeführt, ...
Das Festlegen der Schriftart für die gesamte Site...
Inhaltsverzeichnis Vorwort Start Ein kleiner Geda...
Vorwort Nginx ist ein auf Leistung ausgelegter HT...
Inhaltsverzeichnis 1. Gründe für Indexfehler 2. S...
Inhaltsverzeichnis 1. Einführung in Jenkins 2. Je...
Verwendung von Anker-Tags: Als Ankerlink wird ein ...
In diesem Artikelbeispiel wird der spezifische Co...
Gestern, als ich die Funktion zum Hochladen von B...
Hintergrund Wenn Sie eine Funktion entwickeln, di...
In diesem Artikelbeispiel wird der spezifische Co...
Der detaillierte Prozess zum Konfigurieren des My...