簡體   English   中英

將DIV導出為JPG / PNG-html2canvas不起作用

[英]Export DIV to JPG/PNG - html2canvas doesnt work

我創建了一種徽標生成器,可以使用自定義CSS樣式創建div。 我想添加按鈕“下載”,以便用戶將其作為png / jpg文件獲取。

我瀏覽了所有其他關於stackoverflow的文章,但它們對我沒有用。 我嘗試了html2canvas,但沒有給出預期的結果。

我的div:

<i id="icon" class="fa fa-android" style="text-shadow: rgb(48, 117, 165) 0px 0px, rgb(48, 118, 167) 1px 1px, rgb(49, 120, 169) 2px 2px, rgb(49, 121, 171) 3px 3px, rgb(50, 123, 173) 4px 4px, rgb(51, 124, 175) 5px 5px, rgb(51, 125, 177) 6px 6px, rgb(52, 127, 179) 7px 7px, rgb(52, 128, 181) 8px 8px, rgb(53, 130, 183) 9px 9px, rgb(53, 131, 185) 10px 10px, rgb(54, 133, 187) 11px 11px, rgb(55, 134, 189) 12px 12px, rgb(55, 136, 191) 13px 13px, rgb(56, 137, 193) 14px 14px, rgb(56, 138, 195) 15px 15px, rgb(57, 140, 197) 16px 16px, rgb(58, 141, 199) 17px 17px, rgb(58, 143, 201) 18px 18px, rgb(59, 144, 203) 19px 19px, rgb(59, 146, 205) 20px 20px, rgb(60, 147, 207) 21px 21px, rgb(60, 148, 209) 22px 22px, rgb(61, 150, 211) 23px 23px, rgb(62, 151, 213) 24px 24px, rgb(62, 153, 215) 25px 25px, rgb(63, 154, 217) 26px 26px, rgb(63, 156, 219) 27px 27px, rgb(64, 157, 221) 28px 28px, rgb(65, 158, 223) 29px 29px, rgb(65, 160, 225) 30px 30px, rgb(66, 161, 227) 31px 31px, rgb(66, 163, 229) 32px 32px, rgb(67, 164, 231) 33px 33px, rgb(67, 166, 233) 34px 34px; font-size: 80px; color: white; height: 150px; width: 150px; line-height: 150px; border-radius: 0%; text-align: center; background-color: rgb(68, 167, 235);"></i>

看起來像:

在此處輸入圖片說明

盡管畫布創建了以下內容:

在此處輸入圖片說明

根據文檔,可能不支持某些CSS,我擔心這種情況正在發生。 還有其他方法可以將此DIV保存為圖片嗎?

似乎html2canvas不允許進行多個文本陰影處理,但是您可以使用本機畫布命令獲得類似的效果。

您可以在畫布上繪制定向陰影(如運動模糊)。

在此處輸入圖片說明

  1. 在第二個(內存畫布上)上,僅在陰影方向上獲取圖像的輪廓。

    • 在陰影方向上以幾個像素的偏移繪制圖像。

    • 使用destination-out合成來刪除原始圖像。 這僅留下陰影輪廓,該輪廓僅幾像素寬。

  2. 在第三張畫布上,以增加的偏移重復繪制陰影。 這將創建完整的陰影(但它目前是完全不透明的-而非漸變)。

  3. 從圖像[x,y]開始在主畫布上填充漸變,並從圖像開始延伸超過陰影長度的一點。

  4. 通過source-in合成將陰影從第三個畫布繪制到主畫布上。 合成將使陰影以漸變繪制。

  5. 在陰影上繪制原始圖像。

  6. 使用destination-over合成在陰影圖像的“下方”繪制背景。

  7. 完成-您的圖像上有陰影

這是示例代碼和演示:

 var canvas=document.getElementById("canvas"); var ctx=canvas.getContext("2d"); var cw=canvas.width; var ch=canvas.height; var c=document.createElement('canvas'); cctx=c.getContext('2d'); var cc=document.createElement('canvas'); ccctx=cc.getContext('2d'); c.width=cc.width=cw; c.height=cc.height=ch; // x,y of the image var x=50; var y=50; // shadowing definition variables var offsetX=2; var offsetY=2; var extent=50; var img=new Image(); img.onload=start; img.src="https://dl.dropboxusercontent.com/u/139992952/multple/android.png"; function start(){ // get the offset outline of the image on a second // by drawing the image offset by a few pixels // and then erasing the un-offset image // which leaves just the "shadow" outline cctx.drawImage(img,x+offsetX,y+offsetY); cctx.globalCompositeOperation='destination-out'; cctx.drawImage(img,x,y); cctx.drawImage(img,x,y); cctx.drawImage(img,x,y); cctx.globalCompositeOperation='source-atop'; cctx.fillStyle='black'; cctx.fillRect(0,0,cw,ch); // draw the "shadow" canvas repeatedly // with an increasing offset onto another canvas for(var i=0;i<extent;i++){ ccctx.drawImage(c,i,i) } // create a gradient on the main canvas // going from the image x,y and extending past the image // by a bit less than the shadow length var g=ctx.createLinearGradient(x,y,x+img.width+extent*.75,y+img.height+extent*.75); g.addColorStop(0.00,'rgba(0,0,0,0.50)'); g.addColorStop(0.75,'rgba(0,0,0,.10)'); g.addColorStop(1.00,'rgba(0,0,0,0)'); ctx.fillStyle=g; ctx.fillRect(0,0,cw,ch); // draw the extended shadow from the 3rd canvas onto // the main canvas with 'source-in' compositing so // the shadow is made gradient ctx.globalCompositeOperation='source-in'; ctx.drawImage(cc,0,0); // draw the original image over the shadow // the original image is now shadowed ctx.globalCompositeOperation='source-over'; ctx.drawImage(img,x,y); // draw the background "under" the shadowed image // using 'destination-over' compositing ctx.globalCompositeOperation='destination-over'; ctx.fillStyle='#44A7EB'; ctx.fillRect(0,0,cw,ch); } 
 body{ background-color: ivory; } canvas{border:1px solid red; margin:0 auto; } 
 <canvas id="canvas" width=400 height=400></canvas> 

或者 ,您可以通過重復繪制具有不同不透明度的圖像來創建運動模糊效果。

在此處輸入圖片說明

示例代碼和演示

警告:示例代碼具有硬編碼的值-需要進行調整!

 var canvas=document.getElementById("canvas"); var ctx=canvas.getContext("2d"); var cw=canvas.width; var ch=canvas.height; var image=new Image(); image.onload=start; image.src="https://dl.dropboxusercontent.com/u/139992952/multple/android.png"; function start(){ var c=document.createElement('canvas'); var cctx=c.getContext('2d'); c.width=image.width; c.height=image.height; cctx.translate(c.width/2,c.height/2); cctx.rotate(Math.PI/4); cctx.drawImage(image,-image.width/2,-image.height/2); cctx.setTransform(1,0,0,1,0,0); cctx.globalCompositeOperation='source-atop'; cctx.fillRect(0,0,c.width,c.height); ctx.translate(-50,0); ctx.translate(100,200); ctx.rotate(-Math.PI/4); ctx.clearRect(0,0,canvas.width,canvas.height) var y=0; while (++y <= 100) { ctx.globalAlpha=1/y; ctx.drawImage(c, 0,0, image.width, image.height+y); } ctx.globalAlpha=1; ctx.setTransform(1,0,0,1,0,0); ctx.drawImage(image,96.5,87.5); ctx.globalCompositeOperation='destination-over'; ctx.fillStyle='#44A7EB'; ctx.fillRect(0,0,cw,ch); } 
 body{ background-color: ivory; } canvas{border:1px solid red; margin:0 auto; } 
 <canvas id="canvas" width=500 height=400></canvas> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM