Gibt es eine Möglichkeit, HTML in ein Bild wie PNG zu rendern? Ich weiß, dass es mit Canvas möglich ist, aber ich möchte ein Standard-HTML-Element wie beispielsweise div rendern.
Zum Beispiel, um eine Art Benutzerunterstützung zu erstellen. Leider ist das nicht möglich (aus Sicherheitsgründen?). Sie müssen den Benutzer bitten, PrintScreen zu drücken, um etwas zu tun.
Ich möchte HTML / CSS verwenden, um ein Logo zu entwerfen.
Martin Delille
4
@ ErnestFriedman-Hill kein Duplikat: Die Frage, die Sie erwähnt haben, ist spezifisch für Java.
Martin Delille
Hier ist eine Schritt-für-Schritt-Anleitung zum Konvertieren von HTML in das IMAGE-PNG- oder JPEG-
Satinder singh
Antworten:
41
Ich weiß, dass dies eine ziemlich alte Frage ist, die bereits viele Antworten hat, aber ich habe immer noch stundenlang versucht, das zu tun, was ich wollte:
Generieren Sie bei einer HTML-Datei ein (PNG-) Bild mit transparentem Hintergrund über die Befehlszeile
Mit Chrome Headless (Version 74.0.3729.157 ab dieser Antwort) ist es eigentlich ganz einfach:
Sie führen Chrome über die Befehlszeile aus (hier für den Mac gezeigt, unter Windows oder Linux jedoch ähnlich).
--headless führt Chrome aus, ohne es zu öffnen, und wird nach Abschluss des Befehls beendet
--screenshotwird einen Screenshot aufnehmen (beachten Sie, dass eine Datei generiert wird, die screenshot.pngin dem Ordner aufgerufen wird, in dem der Befehl ausgeführt wird)
--window-sizeErlaube nur einen Teil des Bildschirms zu erfassen (Format ist --window-size=width,height)
--default-background-color=0ist der Zaubertrick, der Chrome anweist, einen transparenten Hintergrund zu verwenden, nicht die standardmäßige weiße Farbe
Schließlich geben Sie die HTML-Datei an (als URL entweder lokal oder remote ...)
Es scheint interessant zu sein, aber ich habe es nicht geschafft, es zum Laufen zu bringen, also habe ich mich für die John Fisher-Lösung entschieden. Danke für die Info, ich werde dieses Projekt in Zukunft sehen!
Martin Delille
@ MartinDelille: hier ein Artikel über die Verwendung von HTML2Canvas zum Erstellen von BILD und Sie können es auch auf clientseitiger codepedia.info/2016/02/… herunterladen
Satinder singh
3
Dom-to-Image (siehe Tsayens Antwort) macht es viel besser, ein genaues Bild zu rendern.
JBE
3
Diese Lösung ist sehr langsam
hamboy75
3
Ein weiteres Problem, wenn das Element versteckt ist oder sich hinter einem anderen Element befindet, funktioniert dies nicht
Yousef
91
Darf ich eine Dom-to-Image- Bibliothek empfehlen , die ausschließlich zur Behebung dieses Problems geschrieben wurde (ich bin der Betreuer).
So verwenden Sie es (weitere hier ):
var node = document.getElementById('my-node');
domtoimage.toPng(node).then (function(dataUrl){var img =newImage();
img.src = dataUrl;
document.appendChild(img);}).catch(function(error){
console.error('oops, something went wrong!', error);});
Das ist toll! Gibt es eine Möglichkeit, die Ausgabegröße zu verdoppeln?
Cronoklee
Vielen Dank! Aber was genau meinst du mit "Verdoppelung der Größe"?
Tsayen
2
Das erste, was mir in den Sinn kommt - versuchen Sie, Ihr Bild in SVG zu rendern (mit domtoimage.toSvg), dann rendern Sie es selbst auf Leinwand und versuchen Sie, irgendwie mit der Auflösung dieser Leinwand zu spielen. Es ist wahrscheinlich möglich, eine solche Funktion als eine Art Rendering-Option in der Bibliothek selbst zu implementieren, sodass Sie Bildabmessungen in Pixel übergeben können. Wenn Sie es brauchen, würde ich mich freuen, wenn Sie ein Problem mit Github erstellen.
Tsayen
8
Dies ist viel besser als html2canvas. Vielen Dank.
c.hughes
1
@ Subho ist ein String, der die URL mit base64-codierten Daten enthält
tsayen
65
Es gibt viele Möglichkeiten und alle haben ihre Vor- und Nachteile.
Option 1: Verwenden Sie eine der vielen verfügbaren Bibliotheken
Vielen Dank für eine detaillierte Antwort mit vielen möglichen Lösungen
bszom
wkhtmltoimage / pdf unterstützt das Rendern von Javascript. Sie können eine Javascript-Verzögerung festlegen oder wkhtml nach einem bestimmten window.status suchen lassen (den Sie mit Javascript festlegen können, wenn Sie wissen, dass Ihre js-Aufgaben erledigt sind)
Daniel Z.
PhantomJS unterstützt dynamische Inhalte wie Google Maps. Es ist wirklich ein vollständiger Webbrowser, nur ohne angeschlossenes Display. Sie müssen jedoch etwas warten, bis Google Map die Kacheln mit der Geografie geladen hat (ich warte 500 ms und erlaube den Leuten, die Verzögerung zu ändern - wenn es nicht ausreicht, ist es in Ordnung, erneut zu laufen, ohne die Zeit zu verlängern, da diese Kacheln zwischengespeichert sind).
Ladislav Zima
50
Alle Antworten hier verwenden Bibliotheken von Drittanbietern, während das Rendern von HTML in ein Bild in reinem Javascript relativ einfach sein kann. Es ist sogar ein Artikel über sie auf der Leinwand Abschnitt auf MDN.
Der Trick ist folgender:
Erstellen Sie eine SVG mit einem ForeignObject-Knoten, der Ihre XHTML enthält
Setzen Sie den Quellcode eines Bildes auf die Daten-URL dieser SVG
Aus Sicherheitsgründen fungiert die SVG als Daten-URL eines Bildes als isolierter CSS-Bereich für den HTML-Code, da keine externen Quellen geladen werden können. So hat eine Google Schrift zum Beispiel inlined werden , um ein Werkzeug wie mit diesem .
Selbst wenn der HTML-Code in der SVG die Größe des Bildes überschreitet, wird er korrekt auf die Leinwand gezeichnet. Die tatsächliche Höhe kann jedoch nicht anhand dieses Bildes gemessen werden. Eine Lösung mit fester Höhe funktioniert einwandfrei, aber die dynamische Höhe erfordert etwas mehr Arbeit. Am besten rendern Sie die SVG-Daten in einen Iframe (für isolierten CSS-Bereich) und verwenden die resultierende Größe für die Zeichenfläche.
Nett! Das Entfernen der Abhängigkeit von externen Bibliotheken ist in der Tat der richtige Weg. Ich habe meine akzeptierte Antwort geändert :-)
Martin Delille
Dieser Artikel ist nicht mehr da.
MSC
2
Tolle Antwort, aber Kommentare zum Stand der Technik von HTML- und Web-APIs, die wie üblich wie etwas aussehen, das jemand hinter sich gelassen hat - die gesamte Funktionalität ist technisch vorhanden, aber hinter einem Array (kein Wortspiel beabsichtigt) seltsamer Codepfade, die ähneln Nichts von der Klarheit, die Sie von gut gestalteten APIs erwarten würden. Im Klartext: Es ist höchstwahrscheinlich trivial Document, wenn ein Browser zulässt , dass a in ein Raster gerendert wird (z. B. a Canvas), aber da sich niemand die Mühe gemacht hat, es zu standardisieren, müssen wir auf den oben dargestellten Wahnsinn zurückgreifen (keine Beleidigung beim Autor Code).
Am
1
Diese Antwort stackoverflow.com/questions/12637395/… scheint darauf hinzudeuten, dass Sie ziemlich weit gehen können. Mozilla und Chrome haben eine unbegrenzte Datenlänge und sogar der aktuelle IE erlaubt 4 GB, was auf etwa 3 GB Bilder (aufgrund von base64) hinausläuft. Aber das wäre eine gute Sache zu testen.
Sjeiti
3
- einige schnelle und schmutzige Tests später - jsfiddle.net/Sjeiti/pcwudrmc/75965 Chrome, Edge und Firefox erreichen eine Breite von mindestens 10.000 Pixel, was (in diesem Fall) einer Zeichenanzahl von etwa 10.000.000 und einer PNG-Dateigröße entspricht von 8 MB. Ich habe nicht rigoros getestet, aber es reicht für die meisten Anwendungsfälle.
Sjeiti
13
Sie können PhantomJS verwenden , ein Headless-Webkit (die Rendering-Engine in Safari und (bis vor kurzem) Chrome) -Treiber. Sie können lernen , wie Screen - Capture - Seiten zu tun hier . Hoffentlich hilft das!
Diese Technik funktioniert gut. Seit Ihrem Kommentar sind jedoch 2 Jahre vergangen. Sind Sie auf etwas gestoßen, das schneller als PhantomJS funktioniert? Nach meiner Erfahrung dauert die Bilderzeugung in Phantom normalerweise 2-5 Sekunden.
Brian Webster
Headless Chrome ist jetzt möglich. Ich weiß nicht, ob es schneller ist, aber wenn Sie genaue Screenshots wünschen, ist dies ein guter Weg.
Josh Maag
11
Sie können ein HTML-zu-PDF-Tool wie wkhtmltopdf verwenden. Und dann können Sie ein PDF-to-Image-Tool wie imagemagick verwenden. Zugegeben, dies ist serverseitig und ein sehr komplizierter Prozess ...
Oder Sie könnten einfach wkhtmltopdfs Image-Bruder wkhtmltoimage ausführen.
Roman Starkov
1
Diese Bibliothek ist für Node.js. Wie wäre es mit einem einfachen Frontend?
Vlad
9
Die einzige Bibliothek, die ich für Chrome, Firefox und MS Edge arbeiten konnte, war rasterizeHTML . Es gibt eine bessere Qualität als HTML2Canvas aus und wird im Gegensatz zu HTML2Canvas weiterhin unterstützt.
@vabanagas gibt es dafür eine einzelne Datei Javascript?
Mahdi Khalili
Diese Änderung hat mir sehr geholfen: rasterizeHTML.drawHTML(node.innerHTML, canvas) Beachten Sie, dass ich innerHTML auf dem Knoten aufrufe
Sep GH
5
Verwenden Sie html2canvas, fügen Sie einfach das Plugin und die Aufrufmethode hinzu , um HTML in Canvas zu konvertieren, und laden Sie es dann als Bild-PNG herunter
Ich erwarte nicht, dass dies die beste Antwort ist, aber es schien interessant genug zu sein, um etwas zu posten.
Schreiben Sie eine App, die Ihren Lieblingsbrowser für das gewünschte HTML-Dokument öffnet, das Fenster richtig dimensioniert und einen Screenshot macht. Entfernen Sie dann die Bildränder.
Haben Sie eine schnelle Version der oben genannten? oder wenn möglich kannst du es bitte neu schreiben?
SSH
Würde es Ihnen etwas ausmachen, den Code zu teilen, den Sie zum Laden der von Ihnen gerenderten WebView verwenden? Dies scheint ein vielversprechender Ansatz für meinen Miniaturbild-Renderer zu sein. Vielen Dank!
Dave
1
Installieren Sie Phantomjs
$ npm install phantomjs
Erstellen Sie eine Datei github.js mit folgendem Code
var page = require('webpage').create();//viewportSize being the actual size of the headless browser
page.viewportSize ={ width:1024, height:768};
page.open('http://github.com/',function(){
page.render('github.png');
phantom.exit();});
Antworten:
Ich weiß, dass dies eine ziemlich alte Frage ist, die bereits viele Antworten hat, aber ich habe immer noch stundenlang versucht, das zu tun, was ich wollte:
Mit Chrome Headless (Version 74.0.3729.157 ab dieser Antwort) ist es eigentlich ganz einfach:
Erläuterung des Befehls:
--headless
führt Chrome aus, ohne es zu öffnen, und wird nach Abschluss des Befehls beendet--screenshot
wird einen Screenshot aufnehmen (beachten Sie, dass eine Datei generiert wird, diescreenshot.png
in dem Ordner aufgerufen wird, in dem der Befehl ausgeführt wird)--window-size
Erlaube nur einen Teil des Bildschirms zu erfassen (Format ist--window-size=width,height
)--default-background-color=0
ist der Zaubertrick, der Chrome anweist, einen transparenten Hintergrund zu verwenden, nicht die standardmäßige weiße Farbequelle
--screenshot='absolute\path\of\screenshot.png'
arbeitete für michJa. HTML2Canvas ist vorhanden, um HTML zu rendern
<canvas>
(das Sie dann als Bild verwenden können).HINWEIS: Es ist ein Problem bekannt, dass dies mit SVG nicht funktioniert
quelle
Darf ich eine Dom-to-Image- Bibliothek empfehlen , die ausschließlich zur Behebung dieses Problems geschrieben wurde (ich bin der Betreuer).
So verwenden Sie es (weitere hier ):
quelle
domtoimage.toSvg
), dann rendern Sie es selbst auf Leinwand und versuchen Sie, irgendwie mit der Auflösung dieser Leinwand zu spielen. Es ist wahrscheinlich möglich, eine solche Funktion als eine Art Rendering-Option in der Bibliothek selbst zu implementieren, sodass Sie Bildabmessungen in Pixel übergeben können. Wenn Sie es brauchen, würde ich mich freuen, wenn Sie ein Problem mit Github erstellen.Es gibt viele Möglichkeiten und alle haben ihre Vor- und Nachteile.
Option 1: Verwenden Sie eine der vielen verfügbaren Bibliotheken
Vorteile
Nachteile
Option 2: Verwenden Sie PhantomJs und möglicherweise eine Wrapper-Bibliothek
Vorteile
Nachteile
Option 3: Verwenden Sie Chrome Headless und möglicherweise eine Wrapper-Bibliothek
Vorteile
Nachteile
Option 4: Verwenden Sie eine API
Vorteile
Nachteile
Offenlegung: Ich bin der Gründer von ApiFlash. Ich habe mein Bestes getan, um eine ehrliche und nützliche Antwort zu geben.
quelle
Alle Antworten hier verwenden Bibliotheken von Drittanbietern, während das Rendern von HTML in ein Bild in reinem Javascript relativ einfach sein kann. Es
istsogar ein Artikel über sie auf der Leinwand Abschnitt auf MDN.Der Trick ist folgender:
drawImage
auf die LeinwandEinige Dinge zu beachten
quelle
Document
, wenn ein Browser zulässt , dass a in ein Raster gerendert wird (z. B. aCanvas
), aber da sich niemand die Mühe gemacht hat, es zu standardisieren, müssen wir auf den oben dargestellten Wahnsinn zurückgreifen (keine Beleidigung beim Autor Code).Sie können PhantomJS verwenden , ein Headless-Webkit (die Rendering-Engine in Safari und (bis vor kurzem) Chrome) -Treiber. Sie können lernen , wie Screen - Capture - Seiten zu tun hier . Hoffentlich hilft das!
quelle
Sie können ein HTML-zu-PDF-Tool wie wkhtmltopdf verwenden. Und dann können Sie ein PDF-to-Image-Tool wie imagemagick verwenden. Zugegeben, dies ist serverseitig und ein sehr komplizierter Prozess ...
quelle
Node.js
. Wie wäre es mit einem einfachen Frontend?Die einzige Bibliothek, die ich für Chrome, Firefox und MS Edge arbeiten konnte, war rasterizeHTML . Es gibt eine bessere Qualität als HTML2Canvas aus und wird im Gegensatz zu HTML2Canvas weiterhin unterstützt.
Element abrufen und als PNG herunterladen
quelle
rasterizeHTML.drawHTML(node.innerHTML, canvas)
Beachten Sie, dass ich innerHTML auf dem Knoten aufrufeVerwenden Sie html2canvas, fügen Sie einfach das Plugin und die Aufrufmethode hinzu , um HTML in Canvas zu konvertieren, und laden Sie es dann als Bild-PNG herunter
Quelle : http://www.freakyjolly.com/convert-html-document-into-image-jpg-png-from-canvas/
quelle
Ich erwarte nicht, dass dies die beste Antwort ist, aber es schien interessant genug zu sein, um etwas zu posten.
Schreiben Sie eine App, die Ihren Lieblingsbrowser für das gewünschte HTML-Dokument öffnet, das Fenster richtig dimensioniert und einen Screenshot macht. Entfernen Sie dann die Bildränder.
quelle
Verwenden Sie diesen Code, es wird sicherlich funktionieren:
Vergessen Sie nicht, die Datei Html2CanvasJS in Ihr Programm aufzunehmen. https://html2canvas.hertzen.com/dist/html2canvas.js
quelle
Mit JavaScript allein können Sie dies nicht 100% genau tun.
Es gibt ein Qt-Webkit- Tool und eine Python-Version . Wenn Sie es selbst machen wollen, habe ich Erfolg mit Cocoa gehabt:
Hoffe das hilft!
quelle
Installieren Sie Phantomjs
Erstellen Sie eine Datei github.js mit folgendem Code
Übergeben Sie die Datei als Argument an phantomjs
quelle
Das kannst du sicher. Mit der JavaScript-API von GrabzIt können Sie ein Div von einer Webseite wie der folgenden erfassen:
Wobei #features die ID des zu erfassenden Div ist. Wenn Sie HTML in ein Bild konvertieren möchten. Sie könnten diese Technik verwenden:
Haftungsausschluss Ich habe diese API erstellt!
quelle
HtmlToImage.jar ist der einfachste Weg, ein HTML in ein Bild zu konvertieren
Konvertieren von HTML in Bilder mit Java
quelle
Sie können Ihrem Projekt den Referenz- HTML-Renderer hinzufügen und Folgendes tun:
quelle