校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 使用html2canvas.js實現頁面截圖并顯示或上傳的示例代碼

使用html2canvas.js實現頁面截圖并顯示或上傳的示例代碼

熱門標簽:黃石ai電銷機器人呼叫中心 如何查看地圖標注 地圖標注軟件打印出來 智能電銷機器人被禁用了么 ok電銷機器人 高德地圖標注商戶怎么標 惡搞電話機器人 欣鼎電銷機器人 效果 電話機器人技術

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

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

一、導入html2canvas.js

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

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

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

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

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

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

到這里其實簡單的截圖已經完成了,如果界面稍微復雜一點的話,可能就會出現各種坑,下面一個一個解決。

二、svg無法截取的問題

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

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

這里的each循環是循環所有的svg標簽,將它們全部轉換為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,網上可以直接下載,也可以直接導入。

三、背景透明的問題

這個其實很簡單,因為它默認是透明的,html2canvas中有一個參數background就可以添加背景色,如下:

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

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

如果需要截取的div超出了界面,可能會遇到截取不全的問題,如上圖,只有一半的內容,這是因為看不到的部分被隱藏了,而html2canvas是無法截取隱藏的dom的。

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

function showQRCode() {
    scrollTo(0, 0);
    
    //克隆節點,默認為false,即不復制方法屬性,為true是全部復制。
    var cloneDom = $("#d1").clone(true);
    //設置克隆節點的z-index屬性,只要比被克隆的節點層級低即可。
    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);
        });
        
        //將克隆節點動態追加到body后面。
        $("body").append(cloneDom);

        html2canvas(cloneDom, {
            onrendered: function(canvas) {
                var url =canvas.toDataURL("image/png");
                window.location.href = url ;
                cloneDom.remove();    //清空克隆的內容
             },
             background:"#fafafa"
        }); 
        
   } 
}

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

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

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

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

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

因為需要在另一個界面中獲取圖片,所以我把圖片存在了與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);    //將圖片的相對路徑存儲到數據庫中
        
        int res = productMapper.insertSelective(product);    //添加到數據庫

這里因為涉及到其它邏輯,所以只放一部分代碼。

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

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

<!-- 配置系統獲得項目根目錄 -->
<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>

現在圖片的url就存到數據庫里了,而圖片本身就存儲在tomcat下該項目的這個目錄下。

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:金昌 綏化 阿壩 聊城 萍鄉 赤峰 盤錦 中山

巨人網絡通訊聲明:本文標題《使用html2canvas.js實現頁面截圖并顯示或上傳的示例代碼》,本文關鍵詞  使用,html2canvas.js,實現,頁面,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用html2canvas.js實現頁面截圖并顯示或上傳的示例代碼》相關的同類信息!
  • 本頁收集關于使用html2canvas.js實現頁面截圖并顯示或上傳的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美日韩国产高清一区二区三区| 国产成人在线看| 欧美激情在线观看视频免费| 色呦呦一区二区三区| 国产一区二区久久| 人禽交欧美网站| 香蕉成人啪国产精品视频综合网 | 久久超碰97中文字幕| 一区二区三区在线观看动漫| 欧美韩国日本综合| 蜜桃视频一区二区三区 | 亚洲欧美色一区| 中国av一区二区三区| 国产情人综合久久777777| 精品剧情v国产在线观看在线| 91精品国产综合久久久久久久久久| 欧美最猛性xxxxx直播| 色av一区二区| 91精品免费在线观看| 伊人色综合久久天天人手人婷| 亚洲成人黄色影院| 日本韩国视频一区二区| 国产精品久久久久久久岛一牛影视 | 久久精品这里都是精品| 久久久久久久久久久久久久久99 | 午夜在线成人av| 91视频在线看| 欧美日韩久久久| 亚洲卡通欧美制服中文| 91在线观看视频| 亚洲欧美日韩国产手机在线| 97久久超碰国产精品电影| 欧美性一级生活| 日韩午夜精品视频| 国产婷婷色一区二区三区 | 首页综合国产亚洲丝袜| 精品一区二区三区影院在线午夜| 丁香天五香天堂综合| 精品在线播放免费| 欧美sm极限捆绑bd| 国产一区二区免费在线| 国产亚洲成aⅴ人片在线观看 | 日韩成人精品在线| 国产aⅴ精品一区二区三区色成熟| 久久新电视剧免费观看| 亚洲一区二区黄色| 国产高清无密码一区二区三区| 欧美电影免费观看高清完整版在线 | 亚洲精品一区二区三区四区高清 | 色婷婷综合五月| 亚洲第一精品在线| 日韩美女在线视频 | 欧美日韩电影在线| 久久 天天综合| 国产精品色婷婷| 欧美亚洲国产一区二区三区va| 午夜视频在线观看一区二区 | 最近日韩中文字幕| 国产成人av在线影院| 综合久久久久久| 欧美日韩一卡二卡| 亚洲天天做日日做天天谢日日欢| 色屁屁一区二区| 久久超碰97人人做人人爱| 综合久久久久综合| 日韩欧美在线一区二区三区| 成人免费视频一区二区| 伊人性伊人情综合网| 精品久久一区二区| 在线观看国产一区二区| 国产一区二区免费看| 一区二区三区在线观看动漫| 精品国产1区2区3区| 欧美性大战久久| 成人手机电影网| 久久99精品久久久久久久久久久久 | 麻豆精品视频在线观看| 亚洲欧洲三级电影| 成人性视频免费网站| 五月天中文字幕一区二区| 中文字幕精品—区二区四季| 欧美日韩一区成人| 色综合色综合色综合| 国产精品影视天天线| 久久理论电影网| 欧美三级资源在线| 91网站在线观看视频| 国模少妇一区二区三区| 国产色综合一区| 制服丝袜在线91| 在线免费亚洲电影| 99久久精品一区二区| 国内精品写真在线观看| 天堂va蜜桃一区二区三区| 亚洲精品乱码久久久久久| 久久久五月婷婷| 亚洲精品在线免费观看视频| 欧美二区三区91| 蜜桃一区二区三区四区| 五月婷婷久久丁香| 亚洲一区在线免费观看| 亚洲欧美激情插| 亚洲欧美自拍偷拍| 中文一区在线播放| 国产日韩欧美制服另类| 久久久久国产一区二区三区四区 | 欧美日韩国产一二三| 色综合天天综合在线视频| 亚洲欧洲av一区二区三区久久| 精品久久国产字幕高潮| 欧美一卡二卡在线观看| 国产成人午夜精品5599| 国产在线精品一区在线观看麻豆| 日本在线播放一区二区三区| 天天av天天翘天天综合网色鬼国产| 亚洲乱码日产精品bd | 国产亚洲欧美色| 久久久久99精品一区| 久久久久久麻豆| 国产亚洲精品超碰| 久久久精品中文字幕麻豆发布| 欧美国产日韩一二三区| 中文字幕不卡的av| 亚洲视频网在线直播| 亚洲欧美另类综合偷拍| 亚洲永久精品国产| 午夜精品久久久久久久久久久 | 懂色av一区二区三区免费看| 成人污视频在线观看| 一本一本久久a久久精品综合麻豆| 一本大道av伊人久久综合| 欧美视频一区二| 欧美mv日韩mv国产网站| 国产女主播一区| 亚洲精品国产无天堂网2021| 性做久久久久久免费观看欧美| 秋霞成人午夜伦在线观看| 国产乱妇无码大片在线观看| 成人网在线播放| 欧美二区在线观看| 欧美国产精品专区| 亚洲超丰满肉感bbw| 狠狠狠色丁香婷婷综合久久五月| 高清不卡一区二区在线| 在线亚洲精品福利网址导航| 91精品国产综合久久香蕉的特点 | 欧美在线视频你懂得| 日韩一区二区三区免费看| 国产日韩欧美电影| 亚洲一级在线观看| 国产乱对白刺激视频不卡| 一本大道久久a久久综合| 日韩一区二区三区av| 国产精品久久久久久久久搜平片| 亚洲第一久久影院| 国产91精品露脸国语对白| 欧美日韩精品欧美日韩精品一| 久久免费美女视频| 亚洲不卡一区二区三区| 国产精一区二区三区| 欧美视频一区二区| 国产精品乱人伦| 久久99精品久久久久婷婷| 色嗨嗨av一区二区三区| 国产日韩av一区| 免费人成精品欧美精品| 色综合天天综合网天天看片| 久久久亚洲精华液精华液精华液 | 日韩免费电影一区| 一区二区久久久| 成人三级在线视频| 欧美mv和日韩mv的网站| 夜色激情一区二区| 成人av资源在线| av午夜精品一区二区三区| 波多野结衣在线一区| 欧美一区二区三区喷汁尤物| 一区二区三区在线免费视频| 国产成人8x视频一区二区| 精品国产一区二区三区久久久蜜月| 亚洲最色的网站| 色综合久久久久久久久| 国产精品入口麻豆原神| 国产精品88av| www欧美成人18+| 国产麻豆视频一区二区| 欧美成人在线直播| 日韩精品色哟哟| 欧美精品电影在线播放| 亚洲va国产天堂va久久en| 欧美色综合影院| 亚洲综合av网| 欧美主播一区二区三区| 一区二区三区在线视频观看58| 99re视频精品| 亚洲人精品午夜| 欧美日韩精品高清| 亚洲成人tv网| 日韩一区二区三区免费观看| 久久精品国产99国产|