2013-02-19 14 views
5

Ich möchte CSS verwenden, um ein Element auf einer Webseite zu stylen und dieses Element dann als statisches PNG zu verwenden. Ist es möglich, HTML-Knoten auf zB zu zeichnen. Leinwand und speichern Sie ein solches Bild mit Transparenz in eine Datei?Wie bekomme ich ein PNG-Bild eines CSS-gestylten Elements, das Canvas mit transparentem Hintergrund verwendet?

Ich möchte einen Weg finden, bereits vorhandenen HTML mit CSS zu nehmen und es in PNG-Datei zu rendern, die Transparenz hält.

+0

ich nehme an, Sie wissen bereits, wie ein HTML5-Canvas-Tag speichern als PNG-Datei (das transparente Pixel hat), und hoffen, etwas zu tun vergleichbar mit reinem HTML und CSS (savi ng des gerenderten HTML-Containers mit Transparenz als PNG-Datei). Ist das korrekt? –

+0

Entschuldigung, ich habe deine Frage nicht gesehen. Ich werde die Frage aktualisieren. –

Antwort

7

Speichern von HTML-Elementen, um Bilder mit einer komplizierten Antwort erfordert!

Erstens, aus sehr guten Sicherheitsgründen erlauben Browser keine gleichseitige Imaging von HTML-Elementen. Stellen Sie sich zum Beispiel ein bösartiges Skript vor, das das HTML-Eingabeformular mit Ihrem Banking-Benutzernamen + Passwort annimmt und es in ein Bild umwandelt und das Bild an einen Dieb sendet - nicht gut!

Daher IE einfach Seite HTML-Element Bildgebung - Zeitraum zu blockieren.

Chrome und Firefox Macht haben noch eine Funktion (Bug ?!), die Sie HTML-Elemente in Bilder wie diese drehen erlaubt: 1. einbetten das HTML-Element in ein SVG-Element mit „foreign“. 2. Zeichnen Sie das SVG-Element in ein Canvas-Element. 3. Verwenden Sie canvas.toDataURL ('image/png'), um eine codierte Zeichenfolge zu erhalten, die das PNG-Bild darstellt.

Da es so aussieht, als hätten Sie die Kontrolle über das Formatieren des HTML, haben Sie möglicherweise eine vollständige Lösung, indem Sie einen "kopflosen" HTML-Generator wie PhantomJs.org (phantomjs.org) verwenden. Sie können Phantomjs zum Generieren und Stylen des HTML-Elements verwenden. PhantomJs verfügt dann über einen Rasterizer, mit dem Sie dieses Element in ein Bild konvertieren können. Plus, wenn Sie eine Webseite dienen kann, die enthält nur der Stil HTML Sie benötigen, dann ist diese 1 Zeile von PhantomJS Code erhalten Sie eine png dieser Seite:

phantomjs rasterize.js http://myHtmlOnMyPage.html myHtmlImage.png 

Der Chrome/Firefox-Code ist https://developer.mozilla.org/en-US/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas

und sieht wie folgt aus: hier

<!DOCTYPE html> 
<html> 
<body> 
<p><canvas id="canvas" style="border:2px solid black;" width="200" height="200"></canvas> 
<script> 
var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" + 
      "<foreignObject width='100%' height='100%'>" + 
       "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:40px'>" + 
       "<em>I</em> like <span style='color:white; text-shadow:0 0 2px blue;'>cheese</span>" + 
       "</div>" + 
      "</foreignObject>" + 
      "</svg>"; 
var DOMURL = self.URL || self.webkitURL || self; 
var img = new Image(); 
var svg = new Blob([data], {type: "image/svg+xml;charset=utf-8"}); 
var url = DOMURL.createObjectURL(svg); 
img.onload = function() { 
    ctx.drawImage(img, 0, 0); 
    DOMURL.revokeObjectURL(url); 
}; 
img.src = url; 
</script> 
</body> 
</html> 
+1

Vielen Dank für Ihre fantastische Antwort. PhantomJS ist etwas, nach dem ich gesucht habe - ich hatte eine Idee, webkit zu verwenden, um diese Elemente mit CSS zu rendern und ich bin wirklich froh, dass jemand es schon gemacht hat;) Leider gibt es Probleme mit der Schattenwiedergabe, was für mich sehr problematisch ist, hoffe ich um dieses Problem mit PhantomJs Jungs zu lösen.Die Verwendung von SVG-Trick unterstützt keine Schatten - zumindest nicht mit Chrome. –

+1

Ich sehe nicht, wie das Sicherheitsargument Wasser hält, da ein bösartiges Skript einfach alle Formwerte an einen Dieb senden kann. Es zuerst zu einem Bild zu machen ist unnötig und wäre unbequem. – towr

+0

@towr Zu der Zeit war IE mit "Pufferüberlauf" Sicherheitslücken gespickt - und Canvas war ein Access Point, um diese Sicherheitslücke auszunutzen. Aber denken Sie im Allgemeinen über all Ihre privaten und sensiblen Dinge nach, die Sie in Ihrem Browser betrachten und dann daran denken, dass jemand Ihnen über die Schulter schauen und diese Dinge auch sehen kann. – markE

Verwandte Themen