当前位置: 首页 > news >正文

js将dom转图片或文件

前言

使用 dom-to-image 库

优点:体积小,使用简单

下载

npm 安装或去 github 下载;

用下面的代码直接创建(造福大家,不用去下载 0.0)

 dom-to-image.min.js

/*! dom-to-image 10-06-2017 */
!function(a){"use strict";function b(a,b){function c(a){return b.bgcolor&&(a.style.backgroundColor=b.bgcolor),b.width&&(a.style.width=b.width+"px"),b.height&&(a.style.height=b.height+"px"),b.style&&Object.keys(b.style).forEach(function(c){a.style[c]=b.style[c]}),a}return b=b||{},g(b),Promise.resolve(a).then(function(a){return i(a,b.filter,!0)}).then(j).then(k).then(c).then(function(c){return l(c,b.width||q.width(a),b.height||q.height(a))})}function c(a,b){return h(a,b||{}).then(function(b){return b.getContext("2d").getImageData(0,0,q.width(a),q.height(a)).data})}function d(a,b){return h(a,b||{}).then(function(a){return a.toDataURL()})}function e(a,b){return b=b||{},h(a,b).then(function(a){return a.toDataURL("image/jpeg",b.quality||1)})}function f(a,b){return h(a,b||{}).then(q.canvasToBlob)}function g(a){"undefined"==typeof a.imagePlaceholder?v.impl.options.imagePlaceholder=u.imagePlaceholder:v.impl.options.imagePlaceholder=a.imagePlaceholder,"undefined"==typeof a.cacheBust?v.impl.options.cacheBust=u.cacheBust:v.impl.options.cacheBust=a.cacheBust}function h(a,c){function d(a){var b=document.createElement("canvas");if(b.width=c.width||q.width(a),b.height=c.height||q.height(a),c.bgcolor){var d=b.getContext("2d");d.fillStyle=c.bgcolor,d.fillRect(0,0,b.width,b.height)}return b}return b(a,c).then(q.makeImage).then(q.delay(100)).then(function(b){var c=d(a);return c.getContext("2d").drawImage(b,0,0),c})}function i(a,b,c){function d(a){return a instanceof HTMLCanvasElement?q.makeImage(a.toDataURL()):a.cloneNode(!1)}function e(a,b,c){function d(a,b,c){var d=Promise.resolve();return b.forEach(function(b){d=d.then(function(){return i(b,c)}).then(function(b){b&&a.appendChild(b)})}),d}var e=a.childNodes;return 0===e.length?Promise.resolve(b):d(b,q.asArray(e),c).then(function(){return b})}function f(a,b){function c(){function c(a,b){function c(a,b){q.asArray(a).forEach(function(c){b.setProperty(c,a.getPropertyValue(c),a.getPropertyPriority(c))})}a.cssText?b.cssText=a.cssText:c(a,b)}c(window.getComputedStyle(a),b.style)}function d(){function c(c){function d(a,b,c){function d(a){var b=a.getPropertyValue("content");return a.cssText+" content: "+b+";"}function e(a){function b(b){return b+": "+a.getPropertyValue(b)+(a.getPropertyPriority(b)?" !important":"")}return q.asArray(a).map(b).join("; ")+";"}var f="."+a+":"+b,g=c.cssText?d(c):e(c);return document.createTextNode(f+"{"+g+"}")}var e=window.getComputedStyle(a,c),f=e.getPropertyValue("content");if(""!==f&&"none"!==f){var g=q.uid();b.className=b.className+" "+g;var h=document.createElement("style");h.appendChild(d(g,c,e)),b.appendChild(h)}}[":before",":after"].forEach(function(a){c(a)})}function e(){a instanceof HTMLTextAreaElement&&(b.innerHTML=a.value),a instanceof HTMLInputElement&&b.setAttribute("value",a.value)}function f(){b instanceof SVGElement&&(b.setAttribute("xmlns","http://www.w3.org/2000/svg"),b instanceof SVGRectElement&&["width","height"].forEach(function(a){var c=b.getAttribute(a);c&&b.style.setProperty(a,c)}))}return b instanceof Element?Promise.resolve().then(c).then(d).then(e).then(f).then(function(){return b}):b}return c||!b||b(a)?Promise.resolve(a).then(d).then(function(c){return e(a,c,b)}).then(function(b){return f(a,b)}):Promise.resolve()}function j(a){return s.resolveAll().then(function(b){var c=document.createElement("style");return a.appendChild(c),c.appendChild(document.createTextNode(b)),a})}function k(a){return t.inlineAll(a).then(function(){return a})}function l(a,b,c){return Promise.resolve(a).then(function(a){return a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),(new XMLSerializer).serializeToString(a)}).then(q.escapeXhtml).then(function(a){return'<foreignObject x="0" y="0" width="100%" height="100%">'+a+"</foreignObject>"}).then(function(a){return'<svg xmlns="http://www.w3.org/2000/svg" width="'+b+'" height="'+c+'">'+a+"</svg>"}).then(function(a){return"data:image/svg+xml;charset=utf-8,"+a})}function m(){function a(){var a="application/font-woff",b="image/jpeg";return{woff:a,woff2:a,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:b,jpeg:b,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml"}}function b(a){var b=/\.([^\.\/]*?)$/g.exec(a);return b?b[1]:""}function c(c){var d=b(c).toLowerCase();return a()[d]||""}function d(a){return a.search(/^(data:)/)!==-1}function e(a){return new Promise(function(b){for(var c=window.atob(a.toDataURL().split(",")[1]),d=c.length,e=new Uint8Array(d),f=0;f<d;f++)e[f]=c.charCodeAt(f);b(new Blob([e],{type:"image/png"}))})}function f(a){return a.toBlob?new Promise(function(b){a.toBlob(b)}):e(a)}function g(a,b){var c=document.implementation.createHTMLDocument(),d=c.createElement("base");c.head.appendChild(d);var e=c.createElement("a");return c.body.appendChild(e),d.href=b,e.href=a,e.href}function h(){var a=0;return function(){function b(){return("0000"+(Math.random()*Math.pow(36,4)<<0).toString(36)).slice(-4)}return"u"+b()+a++}}function i(a){return new Promise(function(b,c){var d=new Image;d.onload=function(){b(d)},d.onerror=c,d.src=a})}function j(a){var b=3e4;return v.impl.options.cacheBust&&(a+=(/\?/.test(a)?"&":"?")+(new Date).getTime()),new Promise(function(c){function d(){if(4===g.readyState){if(200!==g.status)return void(h?c(h):f("cannot fetch resource: "+a+", status: "+g.status));var b=new FileReader;b.onloadend=function(){var a=b.result.split(/,/)[1];c(a)},b.readAsDataURL(g.response)}}function e(){h?c(h):f("timeout of "+b+"ms occured while fetching resource: "+a)}function f(a){console.error(a),c("")}var g=new XMLHttpRequest;g.onreadystatechange=d,g.ontimeout=e,g.responseType="blob",g.timeout=b,g.open("GET",a,!0),g.send();var h;if(v.impl.options.imagePlaceholder){var i=v.impl.options.imagePlaceholder.split(/,/);i&&i[1]&&(h=i[1])}})}function k(a,b){return"data:"+b+";base64,"+a}function l(a){return a.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1")}function m(a){return function(b){return new Promise(function(c){setTimeout(function(){c(b)},a)})}}function n(a){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}function o(a){return a.replace(/#/g,"%23").replace(/\n/g,"%0A")}function p(a){var b=r(a,"border-left-width"),c=r(a,"border-right-width");return a.scrollWidth+b+c}function q(a){var b=r(a,"border-top-width"),c=r(a,"border-bottom-width");return a.scrollHeight+b+c}function r(a,b){var c=window.getComputedStyle(a).getPropertyValue(b);return parseFloat(c.replace("px",""))}return{escape:l,parseExtension:b,mimeType:c,dataAsUrl:k,isDataUrl:d,canvasToBlob:f,resolveUrl:g,getAndEncode:j,uid:h(),delay:m,asArray:n,escapeXhtml:o,makeImage:i,width:p,height:q}}function n(){function a(a){return a.search(e)!==-1}function b(a){for(var b,c=[];null!==(b=e.exec(a));)c.push(b[1]);return c.filter(function(a){return!q.isDataUrl(a)})}function c(a,b,c,d){function e(a){return new RegExp("(url\\(['\"]?)("+q.escape(a)+")(['\"]?\\))","g")}return Promise.resolve(b).then(function(a){return c?q.resolveUrl(a,c):a}).then(d||q.getAndEncode).then(function(a){return q.dataAsUrl(a,q.mimeType(b))}).then(function(c){return a.replace(e(b),"$1"+c+"$3")})}function d(d,e,f){function g(){return!a(d)}return g()?Promise.resolve(d):Promise.resolve(d).then(b).then(function(a){var b=Promise.resolve(d);return a.forEach(function(a){b=b.then(function(b){return c(b,a,e,f)})}),b})}var e=/url\(['"]?([^'"]+?)['"]?\)/g;return{inlineAll:d,shouldProcess:a,impl:{readUrls:b,inline:c}}}function o(){function a(){return b(document).then(function(a){return Promise.all(a.map(function(a){return a.resolve()}))}).then(function(a){return a.join("\n")})}function b(){function a(a){return a.filter(function(a){return a.type===CSSRule.FONT_FACE_RULE}).filter(function(a){return r.shouldProcess(a.style.getPropertyValue("src"))})}function b(a){var b=[];return a.forEach(function(a){try{q.asArray(a.cssRules||[]).forEach(b.push.bind(b))}catch(c){console.log("Error while reading CSS rules from "+a.href,c.toString())}}),b}function c(a){return{resolve:function(){var b=(a.parentStyleSheet||{}).href;return r.inlineAll(a.cssText,b)},src:function(){return a.style.getPropertyValue("src")}}}return Promise.resolve(q.asArray(document.styleSheets)).then(b).then(a).then(function(a){return a.map(c)})}return{resolveAll:a,impl:{readAll:b}}}function p(){function a(a){function b(b){return q.isDataUrl(a.src)?Promise.resolve():Promise.resolve(a.src).then(b||q.getAndEncode).then(function(b){return q.dataAsUrl(b,q.mimeType(a.src))}).then(function(b){return new Promise(function(c,d){a.onload=c,a.onerror=d,a.src=b})})}return{inline:b}}function b(c){function d(a){var b=a.style.getPropertyValue("background");return b?r.inlineAll(b).then(function(b){a.style.setProperty("background",b,a.style.getPropertyPriority("background"))}).then(function(){return a}):Promise.resolve(a)}return c instanceof Element?d(c).then(function(){return c instanceof HTMLImageElement?a(c).inline():Promise.all(q.asArray(c.childNodes).map(function(a){return b(a)}))}):Promise.resolve(c)}return{inlineAll:b,impl:{newImage:a}}}var q=m(),r=n(),s=o(),t=p(),u={imagePlaceholder:void 0,cacheBust:!1},v={toSvg:b,toPng:d,toJpeg:e,toBlob:f,toPixelData:c,impl:{fontFaces:s,images:t,util:q,inliner:r,options:{}}};"undefined"!=typeof module?module.exports=v:a.domtoimage=v}(this);

使用

演示直接加载方式

生成图片查看

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>test</title><script src="./dom-to-image.min.js"></script><style>#app {padding-bottom: 20px;background-color: #fff;}p:nth-child(1) {background-color: yellow;}p:nth-child(3) {background-color: #489494;}p:nth-child(5) {background-color: red;}.button {width: 200px;padding: 5px 50px;cursor: pointer;border: 1px solid #ccc;background-color: #fafafa;border-radius: 5px;text-align: center;}</style></head><body><div id="app"><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p></div><div class="button" onclick="createImg()">生成图片</div></body><script>function createImg() {let node = document.getElementById('app')domtoimage.toPng(node).then(function (dataUrl) {console.log(dataUrl)var img = document.createElement('img')img.src = dataUrldocument.body.appendChild(img)}).catch(function (error) {console.error('生成失败', error)})}</script>
</html>

生成文件并添加到formData(可发送到后端)

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>test</title><script src="./dom-to-image.min.js"></script><style>#app {padding-bottom: 20px;background-color: #fff;}p:nth-child(1) {background-color: yellow;}p:nth-child(3) {background-color: #489494;}p:nth-child(5) {background-color: red;}.button{width: 200px;padding: 5px 50px;cursor: pointer;border: 1px solid #ccc;background-color: #fafafa;border-radius: 5px;text-align: center;}</style></head><body><div id="app"><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p></div><div class="button" onclick="appendFormData()">生成文件添加到formData</div></body><script>function appendFormData() {let node = document.getElementById('app')domtoimage.toBlob(node).then(function (blob) {console.log(blob)let formData = new FormData()formData.append('image', blob, 'image.png')console.log(formData.get('image'))})}</script>
</html>

生成文件并下载

需要借助 FileSaver.js 库,可自行去下载;

以下直接提供(快说好人一生平安( ^_^ ))

 FileSaver.min.js

(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)});//# sourceMappingURL=FileSaver.min.js.map

使用

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>test</title><script src="./dom-to-image.min.js"></script><script src="./FileSaver.min.js"></script><style>#app {padding-bottom: 20px;background-color: #fff;}p:nth-child(1) {background-color: yellow;}p:nth-child(3) {background-color: #489494;}p:nth-child(5) {background-color: red;}.button{width: 200px;padding: 5px 50px;cursor: pointer;border: 1px solid #ccc;background-color: #fafafa;border-radius: 5px;text-align: center;}</style></head><body><div id="app"><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p></div><div class="button" onclick="createFile()">生成文件并下载</div></body><script>function createFile() {let node = document.getElementById('app')domtoimage.toBlob(node).then(function (blob) {window.saveAs(blob, 'my-node.png')})}</script>
</html>

记录一招不显示dom生成图片

给需要生成图片 dom 的上级加个隐身术(隐藏样式);

记得给 dom 本身加个宽度,否则它会随上级一起隐身了;

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>test</title><script src="./dom-to-image.min.js"></script><style>#app {width: 900px;padding-bottom: 20px;background-color: #fff;}p:nth-child(1) {background-color: yellow;}p:nth-child(3) {background-color: #489494;}p:nth-child(5) {background-color: red;}.button {width: 200px;padding: 5px 50px;cursor: pointer;border: 1px solid #ccc;background-color: #fafafa;border-radius: 5px;text-align: center;}</style></head><body><div style="width: 0px; height: 0px; overflow: hidden"><div id="app"><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p><p>6666666666</p></div></div><div class="button" onclick="createImg()">生成图片</div></body><script>function createImg() {let node = document.getElementById('app')domtoimage.toPng(node).then(function (dataUrl) {console.log(dataUrl)var img = document.createElement('img')img.src = dataUrldocument.body.appendChild(img)}).catch(function (error) {console.error('生成失败', error)})}</script>
</html>

其它参考:前端将dom转换成图片_js将dom元素转成图片-CSDN博客

相关文章:

  • MySQL-事务日志
  • 轻兔推荐 —— 一个好用的软件服务推荐平台
  • 【算法】模拟算法——外观数组(medium)
  • 算法题day36(补5.22日卡)
  • 【摩托game】
  • 图像处理ASIC设计方法 笔记26 非均匀性校正SOC如何设计
  • adb server version (22000) doesn‘t match this client (41); killing...
  • 重生之我想写后端
  • 2006NOIP普及组真题 2. 开心的金明
  • Linux|Linux常用命令合集(一)
  • 手机离线翻译哪个好?断网翻译也能超丝滑
  • CSS:cursor作用
  • 手写HTML字符串解析成对应的 AST语法树
  • Dinky MySQLCDC 整库同步到 MySQL jar包冲突问题解决
  • 用esp prog烧录ESP32-C3板踩坑
  • 【附node操作实例】redis简明入门系列—字符串类型
  • JAVA 学习IO流
  • Java教程_软件开发基础
  • Koa2 之文件上传下载
  • Markdown 语法简单说明
  • Mocha测试初探
  • node 版本过低
  • quasar-framework cnodejs社区
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 力扣(LeetCode)22
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 深度解析利用ES6进行Promise封装总结
  • 深入浏览器事件循环的本质
  • 微信支付JSAPI,实测!终极方案
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #android不同版本废弃api,新api。
  • #LLM入门|Prompt#3.3_存储_Memory
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (九十四)函数和二维数组
  • (四)Linux Shell编程——输入输出重定向
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)u-boot-nand.bin的下载
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)ORM
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NetCore项目nginx发布
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET简谈设计模式之(单件模式)
  • .NET文档生成工具ADB使用图文教程
  • @RequestBody的使用