Three.js截圖并下載的大坑焙格。图毕。。

最近做有關(guān)three.js的動畫眷唉,想通過截圖然后在新的頁面打開截圖予颤,并且想把圖片下載到本地,連環(huán)坑很ok??嗯冬阳。這個必須要記下來蛤虐!

先來看看普通頁面的截圖

一開始看到這個,完全沒思路肝陪,普通的html標(biāo)簽要怎么才能變成一張圖驳庭??氯窍?饲常,其實嘞,目前的截圖方案都并不是我們理解的那種截圖狼讨,不管是使用canvas還是svg贝淤,其實都是做了轉(zhuǎn)化,但是這兩種方法都不在這詳細(xì)描述了政供,有興趣的可以看看這篇播聪,說的很詳細(xì)了(canvas VS svg 截圖),然鵝鲫骗,肯定是有工具的啦犬耻,那就是git上開源的 html2canvas,有好多小星星呀执泰,并且使用超簡單枕磁,但是原理也是將html的標(biāo)簽重新繪制到canvas中,其中也有很多不能解決的問題术吝,比如什么文本陰影啊计济,豎版圖片啊之類的,還有E挪浴沦寂!動畫元素截取不出來!L匝谩4亍!!,截屏出來是白屏毯侦。

怎么解決嘞

  • 為什么是白屏:

截取three.js 渲染的圖哭靖,如果直接將輸出的canvas變成圖片是無法獲取的,因為在獲取之前渲染界面是清空的狀態(tài)侈离,所以需要在渲染之后清空之前將渲染的內(nèi)容轉(zhuǎn)換為圖片试幽,即將場景的內(nèi)容渲染一遍并將渲染的內(nèi)容轉(zhuǎn)為圖片數(shù)據(jù)。

  • 解決方案:
shot(){
          let image = new Image();
          renderer.render(scene, camera);//renderer為three.js里的渲染器卦碾,scene為場景 camera為相機

          let imgData = renderer.domElement.toDataURL("image/jpeg");//這里可以選擇png格式j(luò)peg格式
          image.src = imgData;
          document.body.appendChild(image);//這樣就可以查看截出來的圖片了
}
  • 劃重點:

其實就是相當(dāng)于渲染一幀铺坞,并把這一幀輸出
而如果需要截某個部分的圖片,只需要將相機變一下洲胖,換成自己想要范圍济榨,并渲染一幀再截屏出來。
優(yōu)點非常明顯宾濒, 這樣相當(dāng)于重新渲染一幀腿短,即便是截取某個很小的部分,截取的圖片也是很清晰的绘梦。

截完圖之后嘞

我想要的呢是將截的圖展示在新的頁面上橘忱,可是生成的圖片并不是base64的碼,所以我們要將渲染的canvas轉(zhuǎn)化為base64的圖片,toDataURL可以直接做到卸奉,然后展示在新窗口就好啦钝诚。

function debugBase64(base64URL){
       let win = window.open();
       win.document.write('<image id="IframeReportImg" src="' + base64URL  + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen ></image>');
     }

圖片下載

還是基于瀏覽器的功能去操作的

function downloadImage(imgUrl) {
       let a = $("<a></a>").attr("href", imgUrl).attr("download", "img.png").appendTo("body");
       a[0].click();
       a.remove();
     }

其中的imgUrl就是我們之前轉(zhuǎn)好的碼,也就是

 let imgData = renderer.domElement.toDataURL("image/jpeg");/

這里的imgData榄棵。

完成啦

源碼在這

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凝颇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疹鳄,更是在濱河造成了極大的恐慌拧略,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪弓,死亡現(xiàn)場離奇詭異垫蛆,居然都是意外死亡,警方通過查閱死者的電腦和手機腺怯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門袱饭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呛占,你說我怎么就攤上這事虑乖。” “怎么了晾虑?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵疹味,是天一觀的道長仅叫。 經(jīng)常有香客問我,道長佛猛,這世上最難降的妖魔是什么惑芭? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任坠狡,我火速辦了婚禮继找,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逃沿。我一直安慰自己婴渡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布凯亮。 她就那樣靜靜地躺著边臼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪假消。 梳的紋絲不亂的頭發(fā)上柠并,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音富拗,去河邊找鬼臼予。 笑死,一個胖子當(dāng)著我的面吹牛啃沪,可吹牛的內(nèi)容都是我干的粘拾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼创千,長吁一口氣:“原來是場噩夢啊……” “哼缰雇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起追驴,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤械哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殿雪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇咆,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年冠摄,在試婚紗的時候發(fā)現(xiàn)自己被綠了糯崎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡河泳,死狀恐怖沃呢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拆挥,我是刑警寧澤薄霜,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布某抓,位于F島的核電站,受9級特大地震影響惰瓜,放射性物質(zhì)發(fā)生泄漏否副。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一崎坊、第九天 我趴在偏房一處隱蔽的房頂上張望备禀。 院中可真熱鬧,春花似錦奈揍、人聲如沸曲尸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽另患。三九已至,卻和暖如春蛾绎,著一層夾襖步出監(jiān)牢的瞬間昆箕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工租冠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹏倘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓肺稀,卻偏偏與公主長得像第股,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子话原,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容