如何使用FileSaver.js与canvas [英] how to use FileSaver.js with canvas

查看:144
本文介绍了如何使用FileSaver.js与canvas的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

关于如何使用FileSaver.js保存svg画布的任何详细示例



我按照 https://github.com/eligrey/FileSaver.js
但是我看到一个未定义不是一个函数 line83是一个空行。



查看我的示例代码...

 <!doctype html> 

< meta charset =utf-8>

< link rel =stylesheethref =dagre_example.css>
< script src =http://d3js.org/d3.v3.min.jscharset =utf-8>< / script>
< script src =./ dagre-d3.js>< / script>
< script src =./ Blob.js>< / script>
< script src =./ canvas-toBlob.js>< / script>
< script src =./ FileSaver.js>< / script>


< h1> Dagre D3演示:句子令牌化< / h1>



< svg id =svg-canvaswidth = 960 height = 600>< / svg>


< script id =js>
//创建输入图
var g = new dagreD3.graphlib.Graph()
.setGraph({})
.setDefaultEdgeLabel(function(){return {}; });

//这里我们重新设置nodeclass,这是我们自定义drawNodes函数
//下面使用
g.setNode(0,{label:TOP class:type-TOP});
g.setNode(1,{label:S,class:type-S});
g.setNode NP,class:type-NP});
g.setNode(3,{label:DT,class:type-DT});
g.setNode ,{label:This,class:type-TK});
g.setNode(5,{label:VP,class:type-VP});
g .setNode(6,{label:is,class:type-TK});
g.setNode b $ b g.setNode(8,{label:DT,class:type-DT };;
g.setNode(10,{label:an,class:type-TK});
g.setNode(11,{label:NN,class: type-NN});
g.setNode(12,{label:example,class:type-TK});
g.setNode(13,{label:。 ,class:type-。});
g.setNode(14,{label:sentence,class:type-TK});

g.nodes()。forEach(function(v){
var node = g.node(v);
//圆角节点
node.rx = node.ry = 5;
});

//设置边,没有特殊属性。
g.setEdge(3,4);
g.setEdge(2,3);
g.setEdge(1,2);
g.setEdge(6,7);
g.setEdge(5,6);
g.setEdge(9,10);
g.setEdge(8,9);
g.setEdge(11,12);
g.setEdge(8,11);
g.setEdge(5,8);
g.setEdge(1,5);
g.setEdge(13,14);
g.setEdge(1,13);
g.setEdge(0,1)

//创建渲染器
var render = new dagreD3.render();

//设置一个SVG组,以便我们可以翻译最终的图。
var svg = d3.select(svg),
svgGroup = svg.append(g);

//运行渲染器。这就是绘制最终图形。
render(d3.select(svg g),g);

//中心图
var xCenterOffset =(svg.attr(width) - g.graph()。width)/ 2;
svgGroup.attr(transform,translate(+ xCenterOffset +,20));
svg.attr(height,g.g​​raph()。height + 40);


//转换为图像

var canvas = document.getElementById(svg-canvas),ctx = canvas.getContext(2d);

//绘制到画布...
canvas.toBlob(function(blob){
saveAs(blob,prettyimage.png);
} ;

< / script>


解决方案

这里有一个使用FileSaver保存



  var canvas = document.getElementById(canvas); var ctx = canvas.getContext(2d) ; var img = new Image()img.onload = function(){ctx.fillStyle =red; ctx.drawImage(img,0,0); ctx.fillRect(100,100,50,30);} img.crossOrigin =anonymous; img.src =https://dl.dropboxusercontent.com/u/139992952/stackoverflow/ship.png; $(#保存)。click(function(){canvas.toBlob(function(blob){saveAs(blob,temp4.png);});}); ////////////// ////////////////////////// FileSaver脚本//////////////////////// ///////////////// * FileSaver.js * saveAs()FileSaver实现。 * 2014-08-29 * *作者Eli Gray,http://eligrey.com *许可证:X11 / MIT *请参阅https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md * / / * global self * // * jslint bitwise:true,indent:4,laxbreak:true,laxcomma:true,smarttabs:true,plusplus:true * // *! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js * / var saveAs = saveAs // IE 10+(native saveAs)|| (typeof navigator!==undefined&& navigator.msSaveOrOpenBlob&& navigator.msSaveOrOpenBlob.bind(navigator))// Everyone else ||如果(typeof navigator!==undefined& / amp; / MSIE [1-9] \ ./。test(navigator。)),则显式不支持IE < userAgent)){return;} var doc = view.document //只有在必要时才获取URL,以防Blob.js没有覆盖它,get_URL = function(){return view.URL || view.webkitURL || view ;},save_link = doc.createElementNS(http://www.w3.org/1999/xhtml,a),can_use_save_link =下载在save_link中,click = function(node){var event = doc。 createEvent(MouseEvents); event.initMouseEvent(click,true,false,view,0,0,0,0,0,false,false,false,0,null); node.dispatchEvent ;},webkit_req_fs = view.webkitRequestFileSystem,req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem,throw_outside = function(ex){(view.setImmediate || view.setTimeout)(function(){throw ex;}, 0);},force_saveable_type =application / octet-stream,fs_min_size = 0 //见https://code.google.com/p/chromium/issues/detail?id=375297#c7 for the reasoning behind超时和撤销流程,unless_revoke_timeout = 10,revoke = function(file){var revoker = function(){if(typeof file ===string){//文件是一个对象URL get_URL()。revokeObjectURL ); } else {//文件是一个文件file.remove(); }}; if(view.chrome){revoker(); } else {setTimeout(revoker,arbitrary_revoke_timeout); }},dispatch = function(filesaver,event_types,event){event_types = [] .concat(event_types); var i = event_types.length; while(i--){var listener = filesaver [on+ event_types [i]]; if(typeof listener ===function){try {listener.call(filesaver,event || filesaver); } catch(ex){throw_outside(ex);首先尝试a.download,然后web文件系统,然后对象的URL var filesaver = this,type = blob.type,blob_changed = false,object_url,target_view,dispatch_all = function(){dispatch(filesaver,writestart progress write writeend.split()); } //对任何filesys错误恢复到使用对象URL保存fs_error = function(){//不要创建比所需更多的对象URL(blob_changed ||!object_url){object_url = get_URL()。createObjectURL(blob) ; } if(target_view){target_view.location.href = object_url; } else {var new_tab = view.open(object_url,_blank); if(new_tab == undefined&& typeof safari!==undefined){// Apple不允许window.open,请参阅http://bit.ly/1kZffRI view.location.href = object_url}}文件.readyState = filesaver.DONE; dispatch_all(); revoke(object_url); },abortable = function(func){return function(){if(filesaver.readyState!== filesaver.DONE){return func.apply(this,arguments) }}; },create_if_not_found = {create:true,exclusive:false},slice; filesaver.readyState = filesaver.INIT; if(!name){name =download; } if(can_use_save_link){object_url = get_URL()。createObjectURL(blob); save_link.href = object_url; save_link.download = name;点击(save_link); filesaver.readyState = filesaver.DONE; dispatch_all(); revoke(object_url);返回; } //在标签页中查看时,对象和网络文件系统网址在Google Chrome中保存时出现问题,因此我强制保存为application / octet-stream // http://code.google.com/p/chromium/issues / detail?id = 91158 //更新:Google错误地关闭91158,我再次提交:// https://code.google.com/p/chromium/issues/detail?id=389642 if(view.chrome& & type&&&type!== force_saveable_type){slice = blob.slice || blob.webkitSlice; blob = slice.call(blob,0,blob.size,force_saveable_type); blob_changed = true; } //因为我不能确定猜测的媒体类型将触发下载//在WebKit中,我附加.download到文件名。 // https://bugs.webkit.org/show_bug.cgi?id=65440 if(webkit_req_fs&& name!==download){name + =.download; } if(type === force_saveable_type || webkit_req_fs){target_view = view; } if(!req_fs){fs_error();返回; } fs_min_size + = blob.size; req_fs(view.TEMPORARY,fs_min_size,abortable(function(fs){fs.root.getDirectory(saved,create_if_not_found,abortable(function(dir){var save = function(){dir.getFile(name,create_if_not_found,abortable (fileserver,文件,文件,文件,文件,文件,文件,文件等); file.createWriter(abortable(function(writer){writer.onwriteend = function(event){target_view.location.href = file.toURL(); filesaver.readyState = filesaver.DONE; dispatch writeend,event); revoke(file);}; writer.onerror = function(){var error = writer.error; if(error.code!== error.ABORT_ERR){fs_error();}}; writestart progress write abort.split().forEach(function(event){writer [on+ event] = filesaver [on+ event];}); writer.write(blob); filesaver.abort = function(){writer.abort(); filesaver.readyState = filesaver.DONE; }; filesaver.readyState = filesaver.WRITING; }),fs_error); }),fs_error); }; dir.getFile(name,{create:false},abortable(function(file){//如果文件已经存在就删除文件file.remove(); save();} .code === ex.NOT_FOUND_ERR){save();} else {fs_error();}})); }),fs_error); }),fs_error); },FS_proto = FileSaver.prototype,saveAs = function(blob,name){return new FileSaver(blob,name); }; FS_proto.abort = function(){var filesaver = this; filesaver.readyState = filesaver.DONE; dispatch(fileaver,abort); }; FS_proto.readyState = FS_proto.INIT = 0; FS_proto.WRITING = 1; FS_proto.DONE = 2; FS_proto.error = FS_proto.onwritestart = FS_proto.onprogress = FS_proto.onwrite = FS_proto.onabort = FS_proto.onerror = FS_proto.onwriteend = null; return saveAs;}(typeof self!==undefined&& self || typeof window!==undefined&&&&&&&&&&&对于Android内容脚本上下文//而`this`是nsIContentFrameMessageManager //具有对应于windowif的属性`content`(typeof module!==undefined&& module!== null){module.exports = saveAs;} else if((typeof define!==undefined&& define!== null)&&(define.amd!= null)){define([ ;});} / * canvas-toBlob.js *一个canvas.toBlob()实现。 * 2013-12-27 * *由Eli Gray,http://eligrey.com和Devin Samarin,https://github.com/eboyjr *许可证:X11 / MIT *请参阅https://github.com/eligrey/ canvas-toBlob.js / blob / master / LICENSE.md * // * global self * // * jslint bitwise:true,regexp:true,confusion:true,es5:true,vars:true,white:true,plusplus: true * // *! @source http://purl.eligrey.com/github/canvas-toBlob.js/blob/master/canvas-toBlob.js * /(function(view){use strict; var Uint8Array = view.Uint8Array,HTMLCanvasElement = view.HTMLCanvasElement,canvas_proto = HTMLCanvasElement&& HTMLCanvasElement.prototype,is_base64_regex = / \s *; \s * base64 \s *(?:; | $)/ i,to_data_url =toDataURL,base64_ranks ,decode_base64 = function(base64){var len = base64.length,buffer = new Uint8Array(len / 4 * 3 | 0),i = 0,outptr = 0,last = [0,0],state = 0,save = 0,rank,code,undef; while(len--){code = base64.charCodeAt(i ++); rank = base64_ranks [code-43]; if(rank!== 255& ){last [1] = last [0]; last [0] = code; save =(save<`6)| rank; state ++; if(state === 4){buffer [outptr ++] ;>> 16; if(last [1]!== 61 / * padding character * /){buffer [outptr ++] = save>> 8; } if(last [0]!== 61 / * padding character * /){buffer [outptr ++] = save; } state = 0; }}} // 2/3有可能在最后有一些空字节,但是//对大多数图像格式来说并不重要。 //如果它对你很重要,截断缓冲区outptr。返回缓冲区; }; if(Uint8Array){base64_ranks = new Uint8Array([62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1, -1,0,1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, 18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,36,38, 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51] } if(HTMLCanvasElement&&!canvas_proto.toBlob){canvas_proto.toBlob = function(callback,type / *,... args * /){if(!type){type =image / png } if(this.mozGetAsFile){callback(this.mozGetAsFile(canvas,type));返回; } if(this.msToBlob&& /^\s*image\/png\s*(?:$|;)/i.test(type)){callback(this.msToBlob());返回; } var args = Array.prototype.slice.call(arguments,1),dataURI = this [to_data_url] .apply(this,args),header_end = dataURI.indexOf(,),data = dataURI.substring(header_end + 1),is_base64 = is_base64_regex.test(dataURI.substring(0,header_end)),blob; if(is_base64){blob.encoding =base64;如果(Blob.fake){//没有理由解码数据:URI只是将再次成为一个数据URI。 } else {blob.encoding =URI; } blob.data = data; blob.size = data.length; } else if(Uint8Array){if(is_base64){blob = new Blob([decode_base64(data)],{type:type}); } else {blob = new Blob([decodeURIComponent(data)],{type:type}); }} callback(blob); }; if(canvas_proto.toDataURLHD){canvas_proto.toBlobHD = function(){to_data_url =toDataURLHD; var blob = this.toBlob(); to_data_url =toDataURL; return blob; }} else {canvas_proto.toBlobHD = canvas_proto.toBlob; }}(typeof self!==undefined&&& self || typeof window!==undefined&&&&&&&< 

  body {background-color:ivory; } canvas {border:1px solid red;}  

  script src =https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js>< / script>< button id =save>保存< / gt;< br>< br>< br>< canvas id =canvaswidth = 300 height = 300>< / canvas>  p> 

Any detailed examples on how to use FileSaver.js to save a svg canvas?

I followed the canvas example on https://github.com/eligrey/FileSaver.js However I'm seeing an "undefined is not a function" on line83 which is an empty line.

See my example code...

<!doctype html>

<meta charset="utf-8">

<link rel="stylesheet" href="dagre_example.css">
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script src="./dagre-d3.js"></script>
<script src="./Blob.js"></script>
<script src="./canvas-toBlob.js"></script>
<script src="./FileSaver.js"></script>


<h1>Dagre D3 Demo: Sentence Tokenization</h1>



<svg id="svg-canvas" width=960 height=600></svg>


<script id="js">
// Create the input graph
var g = new dagreD3.graphlib.Graph()
  .setGraph({})
  .setDefaultEdgeLabel(function() { return {}; });

// Here we"re setting nodeclass, which is used by our custom drawNodes function
// below.
g.setNode(0,  { label: "TOP",       class: "type-TOP" });
g.setNode(1,  { label: "S",         class: "type-S" });
g.setNode(2,  { label: "NP",        class: "type-NP" });
g.setNode(3,  { label: "DT",        class: "type-DT" });
g.setNode(4,  { label: "This",      class: "type-TK" });
g.setNode(5,  { label: "VP",        class: "type-VP" });
g.setNode(6,  { label: "VBZ",       class: "type-VBZ" });
g.setNode(7,  { label: "is",        class: "type-TK" });
g.setNode(8,  { label: "NP",        class: "type-NP" });
g.setNode(9,  { label: "DT",        class: "type-DT" });
g.setNode(10, { label: "an",        class: "type-TK" });
g.setNode(11, { label: "NN",        class: "type-NN" });
g.setNode(12, { label: "example",   class: "type-TK" });
g.setNode(13, { label: ".",         class: "type-." });
g.setNode(14, { label: "sentence",  class: "type-TK" });

g.nodes().forEach(function(v) {
  var node = g.node(v);
  // Round the corners of the nodes
  node.rx = node.ry = 5;
});

// Set up edges, no special attributes.
g.setEdge(3, 4);
g.setEdge(2, 3);
g.setEdge(1, 2);
g.setEdge(6, 7);
g.setEdge(5, 6);
g.setEdge(9, 10);
g.setEdge(8, 9);
g.setEdge(11,12);
g.setEdge(8, 11);
g.setEdge(5, 8);
g.setEdge(1, 5);
g.setEdge(13,14);
g.setEdge(1, 13);
g.setEdge(0, 1)

// Create the renderer
var render = new dagreD3.render();

// Set up an SVG group so that we can translate the final graph.
var svg = d3.select("svg"),
    svgGroup = svg.append("g");

// Run the renderer. This is what draws the final graph.
render(d3.select("svg g"), g);

// Center the graph
var xCenterOffset = (svg.attr("width") - g.graph().width) / 2;
svgGroup.attr("transform", "translate(" + xCenterOffset + ", 20)");
svg.attr("height", g.graph().height + 40);


// Convert to image

var canvas = document.getElementById("svg-canvas"), ctx = canvas.getContext("2d");

// draw to canvas...
canvas.toBlob(function(blob) {
    saveAs(blob, "prettyimage.png");
});

</script>

解决方案

Here's a working example using FileSaver to save locally:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

var img=new Image()
img.onload=function(){
  ctx.fillStyle="red";
  ctx.drawImage(img,0,0);
  ctx.fillRect(100,100,50,30);
}
img.crossOrigin="anonymous";
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/ship.png";


$("#save").click(function(){
  canvas.toBlob(function(blob){ saveAs(blob,"temp4.png"); });
});


//////////////////////////////////////
// FileSaver scripts
//////////////////////////////////////

/* FileSaver.js
             * A saveAs() FileSaver implementation.
             * 2014-08-29
             *
             * By Eli Grey, http://eligrey.com
             * License: X11/MIT
             *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
             */

/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */

var saveAs = saveAs
// IE 10+ (native saveAs)
|| (typeof navigator !== "undefined" &&
    navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
// Everyone else
|| (function(view) {
  "use strict";
  // IE <10 is explicitly unsupported
  if (typeof navigator !== "undefined" &&
      /MSIE [1-9]\./.test(navigator.userAgent)) {
    return;
  }
  var
  doc = view.document
  // only get URL when necessary in case Blob.js hasn't overridden it yet
  , get_URL = function() {
    return view.URL || view.webkitURL || view;
  }
  , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
  , can_use_save_link = "download" in save_link
  , click = function(node) {
    var event = doc.createEvent("MouseEvents");
    event.initMouseEvent(
      "click", true, false, view, 0, 0, 0, 0, 0
      , false, false, false, false, 0, null
    );
    node.dispatchEvent(event);
  }
  , webkit_req_fs = view.webkitRequestFileSystem
  , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
  , throw_outside = function(ex) {
    (view.setImmediate || view.setTimeout)(function() {
      throw ex;
    }, 0);
  }
  , force_saveable_type = "application/octet-stream"
  , fs_min_size = 0
  // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
  // the reasoning behind the timeout and revocation flow
  , arbitrary_revoke_timeout = 10
  , revoke = function(file) {
    var revoker = function() {
      if (typeof file === "string") { // file is an object URL
        get_URL().revokeObjectURL(file);
      } else { // file is a File
        file.remove();
      }
    };
    if (view.chrome) {
      revoker();
    } else {
      setTimeout(revoker, arbitrary_revoke_timeout);
    }
  }
  , dispatch = function(filesaver, event_types, event) {
    event_types = [].concat(event_types);
    var i = event_types.length;
    while (i--) {
      var listener = filesaver["on" + event_types[i]];
      if (typeof listener === "function") {
        try {
          listener.call(filesaver, event || filesaver);
        } catch (ex) {
          throw_outside(ex);
        }
      }
    }
  }
  , FileSaver = function(blob, name) {
    // First try a.download, then web filesystem, then object URLs
    var
    filesaver = this
    , type = blob.type
    , blob_changed = false
    , object_url
    , target_view
    , dispatch_all = function() {
      dispatch(filesaver, "writestart progress write writeend".split(" "));
    }
    // on any filesys errors revert to saving with object URLs
    , fs_error = function() {
      // don't create more object URLs than needed
      if (blob_changed || !object_url) {
        object_url = get_URL().createObjectURL(blob);
      }
      if (target_view) {
        target_view.location.href = object_url;
      } else {
        var new_tab = view.open(object_url, "_blank");
        if (new_tab == undefined && typeof safari !== "undefined") {
          //Apple do not allow window.open, see http://bit.ly/1kZffRI
          view.location.href = object_url
        }
      }
      filesaver.readyState = filesaver.DONE;
      dispatch_all();
      revoke(object_url);
    }
    , abortable = function(func) {
      return function() {
        if (filesaver.readyState !== filesaver.DONE) {
          return func.apply(this, arguments);
        }
      };
    }
    , create_if_not_found = {create: true, exclusive: false}
    , slice
    ;
    filesaver.readyState = filesaver.INIT;
    if (!name) {
      name = "download";
    }
    if (can_use_save_link) {
      object_url = get_URL().createObjectURL(blob);
      save_link.href = object_url;
      save_link.download = name;
      click(save_link);
      filesaver.readyState = filesaver.DONE;
      dispatch_all();
      revoke(object_url);
      return;
    }
    // Object and web filesystem URLs have a problem saving in Google Chrome when
    // viewed in a tab, so I force save with application/octet-stream
    // http://code.google.com/p/chromium/issues/detail?id=91158
    // Update: Google errantly closed 91158, I submitted it again:
    // https://code.google.com/p/chromium/issues/detail?id=389642
    if (view.chrome && type && type !== force_saveable_type) {
      slice = blob.slice || blob.webkitSlice;
      blob = slice.call(blob, 0, blob.size, force_saveable_type);
      blob_changed = true;
    }
    // Since I can't be sure that the guessed media type will trigger a download
    // in WebKit, I append .download to the filename.
    // https://bugs.webkit.org/show_bug.cgi?id=65440
    if (webkit_req_fs && name !== "download") {
      name += ".download";
    }
    if (type === force_saveable_type || webkit_req_fs) {
      target_view = view;
    }
    if (!req_fs) {
      fs_error();
      return;
    }
    fs_min_size += blob.size;
    req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
      fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
        var save = function() {
          dir.getFile(name, create_if_not_found, abortable(function(file) {
            file.createWriter(abortable(function(writer) {
              writer.onwriteend = function(event) {
                target_view.location.href = file.toURL();
                filesaver.readyState = filesaver.DONE;
                dispatch(filesaver, "writeend", event);
                revoke(file);
              };
              writer.onerror = function() {
                var error = writer.error;
                if (error.code !== error.ABORT_ERR) {
                  fs_error();
                }
              };
              "writestart progress write abort".split(" ").forEach(function(event) {
                writer["on" + event] = filesaver["on" + event];
              });
              writer.write(blob);
              filesaver.abort = function() {
                writer.abort();
                filesaver.readyState = filesaver.DONE;
              };
              filesaver.readyState = filesaver.WRITING;
            }), fs_error);
          }), fs_error);
        };
        dir.getFile(name, {create: false}, abortable(function(file) {
          // delete file if it already exists
          file.remove();
          save();
        }), abortable(function(ex) {
          if (ex.code === ex.NOT_FOUND_ERR) {
            save();
          } else {
            fs_error();
          }
        }));
      }), fs_error);
    }), fs_error);
  }
  , FS_proto = FileSaver.prototype
  , saveAs = function(blob, name) {
    return new FileSaver(blob, name);
  }
  ;
  FS_proto.abort = function() {
    var filesaver = this;
    filesaver.readyState = filesaver.DONE;
    dispatch(filesaver, "abort");
  };
  FS_proto.readyState = FS_proto.INIT = 0;
  FS_proto.WRITING = 1;
  FS_proto.DONE = 2;

  FS_proto.error =
    FS_proto.onwritestart =
    FS_proto.onprogress =
    FS_proto.onwrite =
    FS_proto.onabort =
    FS_proto.onerror =
    FS_proto.onwriteend =
    null;

  return saveAs;
}(
  typeof self !== "undefined" && self
  || typeof window !== "undefined" && window
  || this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window

if (typeof module !== "undefined" && module !== null) {
  module.exports = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
  define([], function() {
    return saveAs;
  });
}

/* canvas-toBlob.js
             * A canvas.toBlob() implementation.
             * 2013-12-27
             * 
             * By Eli Grey, http://eligrey.com and Devin Samarin, https://github.com/eboyjr
             * License: X11/MIT
             *   See https://github.com/eligrey/canvas-toBlob.js/blob/master/LICENSE.md
             */

/*global self */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
              plusplus: true */

/*! @source http://purl.eligrey.com/github/canvas-toBlob.js/blob/master/canvas-toBlob.js */

(function(view) {
  "use strict";
  var
  Uint8Array = view.Uint8Array
  , HTMLCanvasElement = view.HTMLCanvasElement
  , canvas_proto = HTMLCanvasElement && HTMLCanvasElement.prototype
  , is_base64_regex = /\s*;\s*base64\s*(?:;|$)/i
  , to_data_url = "toDataURL"
  , base64_ranks
  , decode_base64 = function(base64) {
    var
    len = base64.length
    , buffer = new Uint8Array(len / 4 * 3 | 0)
    , i = 0
    , outptr = 0
    , last = [0, 0]
    , state = 0
    , save = 0
    , rank
    , code
    , undef
    ;
    while (len--) {
      code = base64.charCodeAt(i++);
      rank = base64_ranks[code-43];
      if (rank !== 255 && rank !== undef) {
        last[1] = last[0];
        last[0] = code;
        save = (save << 6) | rank;
        state++;
        if (state === 4) {
          buffer[outptr++] = save >>> 16;
          if (last[1] !== 61 /* padding character */) {
            buffer[outptr++] = save >>> 8;
          }
          if (last[0] !== 61 /* padding character */) {
            buffer[outptr++] = save;
          }
          state = 0;
        }
      }
    }
    // 2/3 chance there's going to be some null bytes at the end, but that
    // doesn't really matter with most image formats.
    // If it somehow matters for you, truncate the buffer up outptr.
    return buffer;
  }
  ;
  if (Uint8Array) {
    base64_ranks = new Uint8Array([
      62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1
      , -1, -1,  0, -1, -1, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9
      , 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
      , -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
      , 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
    ]);
  }
  if (HTMLCanvasElement && !canvas_proto.toBlob) {
    canvas_proto.toBlob = function(callback, type /*, ...args*/) {
      if (!type) {
        type = "image/png";
      } if (this.mozGetAsFile) {
        callback(this.mozGetAsFile("canvas", type));
        return;
      } if (this.msToBlob && /^\s*image\/png\s*(?:$|;)/i.test(type)) {
        callback(this.msToBlob());
        return;
      }

      var
      args = Array.prototype.slice.call(arguments, 1)
      , dataURI = this[to_data_url].apply(this, args)
      , header_end = dataURI.indexOf(",")
      , data = dataURI.substring(header_end + 1)
      , is_base64 = is_base64_regex.test(dataURI.substring(0, header_end))
      , blob
      ;
      if (Blob.fake) {
        // no reason to decode a data: URI that's just going to become a data URI again
        blob = new Blob
        if (is_base64) {
          blob.encoding = "base64";
        } else {
          blob.encoding = "URI";
        }
        blob.data = data;
        blob.size = data.length;
      } else if (Uint8Array) {
        if (is_base64) {
          blob = new Blob([decode_base64(data)], {type: type});
        } else {
          blob = new Blob([decodeURIComponent(data)], {type: type});
        }
      }
      callback(blob);
    };

    if (canvas_proto.toDataURLHD) {
      canvas_proto.toBlobHD = function() {
        to_data_url = "toDataURLHD";
        var blob = this.toBlob();
        to_data_url = "toDataURL";
        return blob;
      }
    } else {
      canvas_proto.toBlobHD = canvas_proto.toBlob;
    }
  }
}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));

body{ background-color: ivory; }
canvas{border:1px solid red;}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<button id="save">Save</button><br>
<canvas id="canvas" width=300 height=300></canvas>

这篇关于如何使用FileSaver.js与canvas的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆