„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
In diesem Artikel finden Sie den spezifischen Cod...
Inhaltsverzeichnis Date-Objekt Erstellen eines Da...
Dieser Artikel beschreibt Beispiele zum Erstellen...
SQL-Anweisung /* Einige Methoden zum Eliminieren ...
Zwei Möglichkeiten zum Navigieren auf der Seite D...
Installationsschritte 1. Redis installieren Laden...
Als ich heute ein kleines Programm schrieb, benut...
Ich habe kürzlich an mehreren virtuellen Maschine...
Inhaltsverzeichnis 1. Beschreibung der Funktionen...
Inhaltsverzeichnis Fazit zuerst Frage Lösung Verw...
Dieser Artikel stellt hauptsächlich die Beispiela...
Ein WeakMap-Objekt ist eine Sammlung von Schlüsse...
<Head>……</head> gibt den Dateikopf vo...
In diesem Artikel wird das Tutorial zur kostenlos...
1. Fügen Sie ein leeres Element desselben Typs hi...