亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

使用html2canvas.js實(shí)現(xiàn)頁面截圖并顯示或上傳的示例代碼

2024-08-26 00:21:13
字體:
供稿:網(wǎng)友

最近寫項(xiàng)目有用到html2canvas.js,可以實(shí)現(xiàn)頁面的截圖功能,但遭遇了許多的坑,特此寫一篇隨筆記錄一下。

在使用html2canvas時可能會遇到諸如只能截取可視化界面、截圖沒有背景色、svg標(biāo)簽無法截取等問題,下面詳細(xì)的說明一下。

一、導(dǎo)入html2canvas.js

這個不需要多說,可以從github上獲?。?nbsp;https://github.com/niklasvh/html2canvas

也可以直接導(dǎo)入鏈接: <script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>

使用起來也非常簡單,具體的API可以去網(wǎng)上查找,生成png圖片使用“image/png”即可。

其中$("#xxx")為你想要截取的div,外面可以通過jquery獲取它,當(dāng)然document獲取也是可以的。

html2canvas($("#xxx"), {         onrendered: function (canvas) {             var url = canvas.toDataURL("image/png");        window.location.href = url;           }   });

其它類型的圖片如jpg,為image/jpeg等等,可自行查詢API。

到這里其實(shí)簡單的截圖已經(jīng)完成了,如果界面稍微復(fù)雜一點(diǎn)的話,可能就會出現(xiàn)各種坑,下面一個一個解決。

二、svg無法截取的問題

當(dāng)我們截取一個div時,如果這個div中存在svg標(biāo)簽,一般情況下是截取不到的,比如截取一個流程圖,得到的是下面這個樣子:

html2canvas.js,頁面截圖,上傳,代碼

可以看到,流程圖的線沒有截取到,也就是svg沒有截取到,這時的解決方法是把svg轉(zhuǎn)換成canvas再進(jìn)行截圖即可,直接上代碼。

這里的each循環(huán)是循環(huán)所有的svg標(biāo)簽,將它們?nèi)哭D(zhuǎn)換為canvas

if (typeof html2canvas !== 'undefined') {        //以下是對svg的處理        var nodesToRecover = [];        var nodesToRemove = [];        var svgElem = cloneDom.find('svg');        svgElem.each(function (index, node) {            var parentNode = node.parentNode;            var svg = node.outerHTML.trim();            var canvas = document.createElement('canvas');            canvas.width = 650;            canvas.height = 798;            canvg(canvas, svg);             if (node.style.position) {                canvas.style.position += node.style.position;                canvas.style.left += node.style.left;                canvas.style.top += node.style.top;            }            nodesToRecover.push({                parent: parentNode,                child: node            });            parentNode.removeChild(node);            nodesToRemove.push({                parent: parentNode,                child: canvas            });            parentNode.appendChild(canvas);        });           }

這里需要用到canvg.js,以及它的依賴文件rgbcolor.js,網(wǎng)上可以直接下載,也可以直接導(dǎo)入。

三、背景透明的問題

這個其實(shí)很簡單,因?yàn)樗J(rèn)是透明的,html2canvas中有一個參數(shù)background就可以添加背景色,如下:

html2canvas(cloneDom, {      onrendered: function(canvas) {           var url =canvas.toDataURL("image/png");      },      background:"#fafafa"}); 

四、只能截取可視部分的問題

如果需要截取的div超出了界面,可能會遇到截取不全的問題,如上圖,只有一半的內(nèi)容,這是因?yàn)榭床坏降牟糠直浑[藏了,而html2canvas是無法截取隱藏的dom的。

所以此時的解決辦法是使用克隆,將需要截取的部分克隆一份放在頁面底層,再使用html2canvas截取這個完整的div,截取完成后再remove這部分內(nèi)容即可,完整代碼如下:

function showQRCode() {    scrollTo(0, 0);        //克隆節(jié)點(diǎn),默認(rèn)為false,即不復(fù)制方法屬性,為true是全部復(fù)制。    var cloneDom = $("#d1").clone(true);    //設(shè)置克隆節(jié)點(diǎn)的z-index屬性,只要比被克隆的節(jié)點(diǎn)層級低即可。    cloneDom.css({        "background-color": "#fafafa",        "position": "absolute",        "top": "0px",        "z-index": "-1",        "height": 798,        "width": 650    });       if (typeof html2canvas !== 'undefined') {        //以下是對svg的處理        var nodesToRecover = [];        var nodesToRemove = [];        var svgElem = cloneDom.find('svg');//divReport為需要截取成圖片的dom的id        svgElem.each(function (index, node) {            var parentNode = node.parentNode;            var svg = node.outerHTML.trim();            var canvas = document.createElement('canvas');            canvas.width = 650;            canvas.height = 798;            canvg(canvas, svg);             if (node.style.position) {                canvas.style.position += node.style.position;                canvas.style.left += node.style.left;                canvas.style.top += node.style.top;            }            nodesToRecover.push({                parent: parentNode,                child: node            });            parentNode.removeChild(node);            nodesToRemove.push({                parent: parentNode,                child: canvas            });            parentNode.appendChild(canvas);        });                //將克隆節(jié)點(diǎn)動態(tài)追加到body后面。        $("body").append(cloneDom);        html2canvas(cloneDom, {            onrendered: function(canvas) {                var url =canvas.toDataURL("image/png");                window.location.href = url ;                cloneDom.remove();    //清空克隆的內(nèi)容             },             background:"#fafafa"        });            } }

這里外面首先將要截取的div克隆一份,并將z-index設(shè)置為最小,避免引起界面的不美觀,然后是對svg進(jìn)行的處理,上面已經(jīng)分析過了,最后將克隆節(jié)點(diǎn)追加到body后面即可。

在onrendered中,我們可以直接使用location.href跳轉(zhuǎn)查看圖片,可以進(jìn)行保存操作,也可以將url寫入img的src中顯示在界面上,如 $('#imgId').attr('src',url);

最后可以在界面展示剛剛截取到的圖片:

html2canvas.js,頁面截圖,上傳,代碼

五、上傳圖片保存到數(shù)據(jù)庫,并在界面中獲取該圖片顯示

現(xiàn)在得到url了,需要上傳到后端,并存到數(shù)據(jù)庫中,再另一個展示的界面中加載該圖片。我一般習(xí)慣于使用url來存儲圖片路徑,而不是用blob存儲。

因?yàn)樾枰诹硪粋€界面中獲取圖片,所以我把圖片存在了與webapp同級的一個resource目錄下,代碼如下:

//存儲圖片并返回圖片路徑        BASE64Decoder decoder = new BASE64Decoder();        byte[] b = decoder.decodeBuffer(product.getProPic().substring("data:image/png;base64,".length()));        ByteArrayInputStream bais = new ByteArrayInputStream(b);        BufferedImage bi1 = ImageIO.read(bais);        String url = "user_resource" + File.separator + "img" + File.separator + "product_"+UUID.randomUUID().toString().replace("-", "")+".png";        String totalUrl = System.getProperty("root") + url;        File w2 = new File(totalUrl);        ImageIO.write(bi1, "png", w2);                product.setProPic(url);    //將圖片的相對路徑存儲到數(shù)據(jù)庫中                int res = productMapper.insertSelective(product);    //添加到數(shù)據(jù)庫

這里因?yàn)樯婕暗狡渌壿嫞灾环乓徊糠执a。

這里使用的是BASE64Decoder來存儲圖片,我們獲取到圖片后,需要使用substring將“data:image/png;base64,”的內(nèi)容截取掉,因?yàn)?ldquo;,”后面才是圖片的url, url.substring("data:image/png;base64,".length()) 。

對于路徑,上面代碼中的url是我存儲到數(shù)據(jù)庫中的內(nèi)容,而totalUrl就是實(shí)際進(jìn)行ImageIO的write操作時存儲的真實(shí)路徑,getProperty()方法獲取的項(xiàng)目的根目錄,可以在web.xml中配置如下內(nèi)容,然后 System.getProperty("root") 即可。

<!-- 配置系統(tǒng)獲得項(xiàng)目根目錄 --><context-param>    <param-name>webAppRootKey</param-name>    <param-value>root</param-value></context-param><listener>    <listener-class>        org.springframework.web.util.WebAppRootListener    </listener-class></listener>

現(xiàn)在圖片的url就存到數(shù)據(jù)庫里了,而圖片本身就存儲在tomcat下該項(xiàng)目的這個目錄下。

html2canvas.js,頁面截圖,上傳,代碼

最后外面在界面上獲取,只需要在當(dāng)前的url前面加上項(xiàng)目名即可 < img class ="depot-img" src ="<%=request.getContextPath()%>/`+e.proPic+`" > 。

然后就可以看到界面上顯示的圖片了:

html2canvas.js,頁面截圖,上傳,代碼

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美在线|欧美| 99精产国品一二三产品香蕉| 色菇凉天天综合网| 日韩欧美伦理电影院| 91偷拍一区二区三区精品| 日本1区2区3区中文字幕| 好久没做在线观看| 美女把尿口扒开让男人桶在线观看| 久久久久国产精品免费网站| 给我看免费高清在线观看| 欧美激情福利视频在线观看免费| 在线免费中文字幕| 日本不卡在线播放| 男人靠女人免费视频网站| 成人看av片| 欧美天堂亚洲电影院在线观看| 在线观看v片| 男人天堂网在线| 国产日韩欧美一区二区三区| 欧美在线欧美在线| 一本色道久久88综合日韩精品| www.cao超碰| 国产精品网红直播| 一区二区亚洲精品| 性刺激的欧美三级视频| 日韩成人精品一区二区| 狠狠色噜噜狠狠狠狠97| 成人精品在线观看视频| 日日夜夜精品视频| 久久国产精品久久久久久电车| 欧美久久久久久一卡四| 国产精品久久久久久久一区二区| 国产在线一卡二卡| 9lporm自拍视频区在线| 亚洲欧美一区二区三区在线观看| 国产精品第一第二| av高清不卡在线| 国产一级做a爰片久久| 波多野结衣电影免费观看| 羞羞视频网站在线免费观看| 欧美一区深夜视频| 久久精品视频一区二区| 性色av浪潮av| 91精品国产乱码久久久久久| 国产中文一区二区三区| 性高潮久久久久久| 97人人模人人爽视频一区二区| 99精品人妻无码专区在线视频区| 国产一级淫片久久久片a级| www.jizz在线观看| 视频一区视频二区在线观看| 不卡av电影在线观看| 国产成人av电影在线| 好吊妞这里只有精品| 国产精品高潮呻吟av| 亚洲麻豆一区二区三区| 日韩欧美在线电影| 中文字幕制服丝袜| 在线视频一区二区三区| 欧美成a人片免费观看久久五月天| 性囗交免费视频观看| www.久久av| 国产1区2区在线| 国产精品9999久久久久仙踪林| 免费啪视频在线观看| 新的色悠悠久久久| 国产精品成人3p一区二区三区| 欧美一区二区精美| 希岛爱理一区二区三区av高清| 一级片在线免费观看视频| 一区二区三区在线观看动漫| 黄色的视频在线免费观看| 国产欧美日韩不卡免费| 蜜臀久久精品久久久用户群体| 成人在色线视频在线观看免费大全| 成人免费淫片95视频观看网站| 日韩精品影片| 国产欧美日韩中文字幕在线| 菠萝蜜视频在线观看一区| 日本在线一级片| 日日躁夜夜躁人人揉av五月天| 99视频精品全国免费| 精品av一区二区| 亚洲一级免费毛片| 久久久久久久久久久久久久一区| h视频免费高清在线观看| 精品72久久久久中文字幕| 亚洲一区二区在线播放| 香港日本韩国三级网站| 欧美激情一区二区三区在线视频| 成人网18免费软件大全| 免费无码国产v片在线观看| 性欧美xxxx视频在线观看| 国产精品一区二区黑丝| 日本中文字幕在线免费观看| 国产美女精品| 欧美精品momsxxx| 国产叼嘿视频在线观看| 亚洲aaaaaaa| 亚洲在线视频网站| 欧美理论电影| 在线播放你懂的| 91精品视频网| 日本wwwxxxx| 黄色网在线视频| 免费在线观看的电影网站| 精品欧美一区二区久久久| 91超碰caoporn97人人| www.视频一区| 999久久久免费精品国产牛牛| 粉嫩精品导航导航| 亚洲同性gay激情无套| 色屁屁草草影院ccyy.com| 最近最新中文字幕在线| 99成人在线| 国产又黄又粗又猛又爽的视频| av日韩国产| 99国产精品久久久久久久| 666av成人影院在线观看| 日韩欧美一级精品久久| 国产一区二区三区精品在线| h网站免费观看| 欧美成人免费在线视频| 色婷婷狠狠18| 国产精品无码久久久久久| 免费污视频在线一区| 成人网在线观看| 免费黄色激情视频| 国产精品国产三级国产普通话三级| 日韩精品卡通动漫网站| 人禽交欧美网站| 少妇被躁爽到高潮无码文| www.日日夜夜| 精品人伦一区二区色婷婷| 懂色av一区二区在线播放| 136导航精品福利| 午夜成人免费电影| av中文在线播放| 无码精品人妻一区二区三区影院| 久久久久国产一区二区三区| 无码一区二区三区在线观看| 亚洲精品成人三区| 欧洲亚洲国产日韩| 人妻av无码专区| 久久不射2019中文字幕| 99精品久久99久久久久| 成人精品第一区二区三区| 亚洲怡红院在线| 亚洲va欧美va国产综合久久| 日本在线观看高清完整版| 国产美女视频免费观看下载软件| 好吊视频在线观看| 亚洲精品乱码电影在线观看| 国户精品久久久久久久久久久不卡| 樱桃视频免费看| 欧美超级免费视 在线| 日本精品一二三区| 日韩欧美一区在线观看| 国产精选一区二区三区不卡催乳| 国产一区二区三区日韩精品| 后进极品白嫩翘臀在线视频| 激情国产一区| 久久99伊人| 在线观看的av| jizz18欧美18| 哪个网站能看毛片| 国产三级日本三级在线播放| 婷婷成人基地| 色视频在线看| 欧美精品二区三区四区免费看视频| eeuss影院www在线观看| 北条麻妃99精品青青久久| 欧美午夜影院在线视频| 黄色成人在线看| 夜夜嗨一区二区三区| 国产一二三四| 中文在线视频观看| 日批免费观看视频| 亚洲精品在线免费观看视频| 成人激情视屏| 一个人看的www在线免费视频| 在线观看免费一区二区| 国产女人18水真多18精品一级做| 136福利精品导航| 天天草天天草| 国产精品一区在线观看| 色婷婷av一区二区三区之e本道| 欧美色欧美亚洲另类二区精品| 天天综合国产| 国产精品九色蝌蚪自拍| 最新国产精品久久| 欧美va久久久噜噜噜久久| 亚洲午夜激情免费视频| 91最新在线观看| 国产成+人+综合+亚洲欧洲| 成视频在线观看免费观看| 欧美老女人性视频| 成人精品天堂一区二区三区| 高清免费日韩| 国产综合在线观看视频| 电影一区二区| 亚洲成a人片77777老司机| 91精品国产色综合久久ai换脸| 免费的国产精品| 在线观看国产精品网站| 成人18网址在线观看| 九九免费精品视频在线观看| 日本网站在线免费观看| 人人九九精品视频| 亚洲欧美另类在线观看| 中文字幕免费在线视频| 国产剧情在线一区| 久久精品72免费观看| 欧美日韩中文字幕在线视频| 激情综合视频| 亚洲一区二区三区久久| 亚洲第一黄色片| 亚洲一区二区三区无码久久| 高清亚洲成在人网站天堂| 69精品人人人人| 男人晚上看的视频| 国产日产欧美一区| theav精尽人亡av| 久久影音资源网| 亚洲成人在线网| 香蕉97视频观看在线观看| 手机在线看片1024| 亚洲精品视频导航| 麻豆精品免费视频入口| 日日夜夜精品视频天天综合网| 日韩欧美国产小视频| 国产一区二区在线不卡| 麻豆影视在线播放| 欧美黑人xxxxx性受| 久久久国产精品视频| 国产欧美精品一区二区三区| 无码人妻丰满熟妇啪啪欧美| 国产精品久久久久久久妇| 欧美一级特黄aaaaaa大片在线观看| 日韩欧美精品在线| 精品亚洲一区二区三区四区五区高| 小泽玛利亚视频在线观看| 国产经典中年夫妇盗摄| √最新版天堂资源网在线| 欧美精品123区| 日本不卡视频一二三区| 日韩在线观看一区二区三区| av免费观看网| 亚洲精品在线国产| baoyu135国产精品免费| 免费成人直播| 91一区二区视频| 性做久久久久久久久| 亚洲综合精品四区| 黄色毛片在线看| 成人少妇影院yyyy| 在线影院自拍| gogogo影视剧免费观看在线观看| 欧美热在线视频精品999| 亚洲天堂av在线| 亚洲精品日韩精品| 欧美伊久线香蕉线新在线| 日韩在线视频导航| 日韩欧美1区| 亚洲18在线| 国产精品第一视频| 国产一级做a爰片在线看免费| 91精品人妻一区二区三区蜜桃2| 春意影院午夜免费入口| 尤物av一区二区| 欧美国产亚洲精品| 久久9999免费视频| 国产99久久久国产精品成人免费| 男人的天堂影院| 亚洲精品少妇久久久久久| 欧亚在线中文字幕免费| 91麻豆高清视频| 99精品国产一区二区三区| 樱花草www在线观看| 少妇视频一区二区| 午夜精品在线播放| 日本一区二区三区视频在线播放| 免费看国产精品一二区视频| 麻豆国产在线播放| 亚洲视频国产视频| 亚洲欧美文学| 中文字幕亚洲自拍| 欧美 亚洲 视频| www.久久精品.com| ●精品国产综合乱码久久久久| 国产一区在线免费观看| 中文av在线播放| 亚洲综合网狠久久| 久久精品国产亚洲av高清色欲| 成人激情五月天| 国产午夜福利精品| 中文在线а√天堂官网| av成人影院在线| 中文字幕人妻一区二区| 欧美一区二区福利视频| 99re6在线观看| 成人av网站大全| av免费播放网站| 91九色综合久久| 91麻豆精品秘密| 久久www成人_看片免费不卡| 爱久久·www| 久草在线视频网| 老牛影视av一区二区在线观看| 免费成人蒂法网站| 嫩草影院网站在线| 欧美毛片免费观看| 99久久综合国产精品| 成人一级片网址| 欧美做受喷浆在线观看| www.黄色小说.com| 亚洲免费久久| 亚洲精品欧美二区三区中文字幕| 欧美熟妇激情一区二区三区| 国产精品久久久久久久久久久久久久久久久久| 最近中文字幕免费mv视频多少集| 精品无码国产一区二区三区av| а√最新版地址在线天堂| 国产精品午夜av| 欧美日韩另类国产亚洲欧美一级| 91福利在线免费观看| 亚洲丰满少妇videoshd| 日韩一区免费观看|