天天看點

純javaScript div儲存圖檔并下載下傳 js+Canvas+Svg

最精簡的原生js開發,更友善擴充開發需要的業務

技術邏輯:

1.将div轉為svg網絡圖檔

2.将建立Canvas畫布

3.将畫布大小和div大小設定一樣大

4.将svg img 畫到Canvas的畫布中 用方法  context.drawImage(img, 0, 0);

5.将Canvas畫布儲存為png圖像

示例程式截圖:

CODE:

<html>
 <body>
     <h2>Input Div:</h2>
     <div id="div">
         <p>Just have a <span style='color: white; text-shadow: 0 0 2px blue;'>TRY</span></p>
         <p><b>By Dion</b></p>
         <div style="width:600px;height:500px;background-color:#000;color:#fff;">
             <div style="width:500px;height:500px;background-color:#111111;color:#fff;">
                 <div style="width:400px;height:500px;background-color:#222222;color:#fff;">
                     <div style="width:300px;height:500px;background-color:#333333;color:#fff;">
                         <div style="width:200px;height:500px;background-color:#666666;color:#fff;">                            這是圖檔5</div>
                         這是圖檔4
                     </div>
                     這是圖檔3
                 </div>
                 這是圖檔2
             </div>
             這是圖檔1
         </div>
     </div>
     <h2>Output Image:</h2>
     <input type="button" value="生成圖檔" onClick="printMap()">
     <input type="button" value="下載下傳圖檔" onClick="saveMap()">
     <div id="ssssssssssss" style="position: fixed;right:0px;top:0px;width:600px;background-color:#333333;"></div>
     <script>
         var imgObj;
         
         function printMap() {
             //1.将div轉成svg
             var divContent = document.getElementById("div").innerHTML;
             var newData = "";
             for ( var i = 0; i < divContent.length; i++) {
                 if (divContent.substr(i, 1) == "#") {
                     newData += '%23';
                 } else {
                     newData += divContent.substr(i, 1);
                 }
             }
             var data = "data:image/svg+xml,"
                     + "<svg id='abcdddd' xmlns='http://www.w3.org/2000/svg' width='600' height='500'>"
                     + "<foreignObject width='100%' height='100%'>"
                     + "<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:16px;font-family:Helvetica'>"
                     + newData + "</div>" + "</foreignObject>" + "</svg>";            var img = new Image();
             img.src = data;
             // document.getElementsByTagName('body')[0].appendChild(img);
             document.getElementById("ssssssssssss").appendChild(img);
             imgObj = img;        }
         
         function saveMap() {
             var img = imgObj;//document.getElementById("ssssssssssss").getElementsByTagName("img");
             //2.svg轉成canvas
             var canvas = document.createElement('canvas'); //準備空畫布
             canvas.width = img.width;
             canvas.height = img.height;            var context = canvas.getContext('2d'); //取得畫布的2d繪圖上下文
             context.drawImage(img, 0, 0);            var type = 'png';
             var imgData = canvas.toDataURL(type);            // 加工image data,替換mime type
             imgData = imgData.replace(_fixType(type), 'image/octet-stream');
             // 下載下傳後的圖檔名
             var filename = 'baidufe_' + (new Date()).getTime() + '.' + type;
             // download
             saveFile(imgData, filename);
         }        var _fixType = function(type) {
             type = type.toLowerCase().replace(/jpg/i, 'jpeg');
             var r = type.match(/png|jpeg|bmp|gif/)[0];
             return 'image/' + r;
         };        var saveFile = function(data, filename) {
             var save_link = document.createElementNS(
                     'http://www.w3.org/1999/xhtml', 'a');
             save_link.href = data;
             save_link.download = filename;            var event = document.createEvent('MouseEvents');
             event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0,
                     false, false, false, false, 0, null);
             save_link.dispatchEvent(event);
         };
     </script>
 </body>
 </html>