2013-02-19 38 views
5

我想使用CSS來設計網頁上的元素,然後將該元素用作靜態PNG。是否有可能在例如。畫布和保存這樣的圖像透明度文件?如何使用具有透明背景的畫布獲取png圖像的CSS樣式元素?

我想找到一種方法來將CSS與現有的HTML一起呈現給PNG文件並保持透明。

+0

我假設你已經知道如何保存一個HTML5 canvas標籤(即具有透明像素)爲PNG文件,並希望做一些事情使用純HTML和CSS(savi將呈現的HTML容器與透明度一起作爲PNG文件)。那是對的嗎? – 2013-02-19 15:27:39

+0

對不起,我沒有看到你的問題。我會更新問題。 – 2013-02-20 01:19:02

回答

7

保存HTML元素的圖像需要一個複雜的答案!

首先,出於非常好的安全性原因,瀏覽器不允許HTML元素的同頁成像。想象一下,例如一個惡意腳本,它將HTML輸入表單包含您的銀行用戶名和密碼,並將其轉換爲圖像並將圖像發送給小偷 - 這不太好!

因此,IE只是屏蔽同一頁面HTML元素的圖像 - 期間。

Chrome和Firefox 威力仍然有一個功能(錯誤?!),它允許你把HTML元素融入到這樣的圖片: 1.嵌入HTML元素到使用「foreignObject」 SVG元素。 2.將SVG元素繪製到Canvas元素中。 3.使用canvas.toDataURL('image/png')獲取一個代表png圖像的編碼字符串。

由於它看起來像是在控制HTML的樣式,所以您可以通過使用像PhantomJs.org(phantomjs.org)這樣的「無頭」HTML生成器來獲得完整的解決方案。您可以使用Phantomjs來生成和設置HTML元素的樣式。 PhantomJs然後有一個光柵化器,您可以使用它將該元素轉換爲圖像。另外,如果你可以成爲一個網頁,其中包含只有的風格的HTML你需要,那麼這1行PhantomJs代碼將得到你頁面的PNG:

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

中的Chrome/Firefox的代碼這裏找到:https://developer.mozilla.org/en-US/docs/HTML/Canvas/Drawing_DOM_objects_into_a_canvas

,看起來像這樣:

<!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

非常感謝你的精彩回答。 PhantomJS是我正在尋找的東西 - 我有一個想法,使用WebKit呈現這些元素與CSS,我真的很高興有人已經這樣做;)不幸的是有渲染陰影的問題,這是非常成問題的,但我希望用PhantomJs傢伙解決這個問題。使用svg技巧根本不支持陰影 - 至少使用chrome。 – 2013-02-20 01:13:48

+1

我不明白安全性參數如何保持水分,因爲惡意腳本可以將所有表單值發送給小偷。首先將其轉化爲圖像是不必要的,並且會很不方便。 – towr 2015-12-02 08:43:17

+0

@towr當時,IE瀏覽器充斥着「緩衝區溢出」漏洞 - 並且canvas是利用此漏洞的一個接入點。但是總的來說,想想你在瀏覽器中看到的所有私人敏感的東西,然後想到有人能夠看到你的肩膀,並看到這些東西。 – markE 2015-12-02 15:03:46