范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

浏览器截图方案分析

  浏览器截图方案分析
  页面截屏 是前端经常遇到的需求,比如页面生成海报,弹窗图片分享等。
  以下是我整理三种截图方案: html2canvas dom-to-image webRTC html2canvas
  html2canvas 用的比较广泛的前端截图方案,先将 DOM 一个个 转为 Canvas 然后导出图片(使用 canvas 自带的 toDataUrl、toBobl)即可。使用起来应该是兼容性比较好的方案了,能解决大部分的需求,但是也有一些小问题,如: 图片跨域,开启 CSS 属性错乱 遇到 canvas 元素导出后为透明色。
  大部分问题还是可以通过配置和百度解决的 const getDomImg = (eleId) => {    html2canvas(document.getElementById(eleId), {        //superMap整个页面的节点         backgroundColor: null, //画出来的图片有白色的边框,不要可设置背景为透明色(null)         allowTaint: true,        useCORS: true, //支持图片跨域         scale: 1, //设置放大的倍数     })         .then((canvas) => {            //截图用img元素承装,显示在页面的上             let img = new Image();             img.src = canvas.toDataURL("image/jpg"); // toDataURL :图片格式转成 base64             // 直接下载             let a = document.createElement("a");             a.href = canvas.toDataURL("image/jpeg");             a.download = "test";             a.click();         })         .catch((err) => {            console.log("html2canvas err", err);         }); }; dom-to-image
  使用 svg,通过 createObjectURL 或 encodeURIComponent 处理 svg 得到图像资源,可以把 svg 绘制到 canvas。
  dom-to-image-more 是dom-to-image的升级版 将 HTMl 放到 SVG 里,然后创建一个以 SVG 作为源的 Image 元素
  但是也有一些问题如: svg 中不允许外部资源(js,css,img 的 url 等),svg 中不支持执行 js,需要经过处理,也不能完全还原const getDomImg = (eleId) => {     domtoimage         .toPng(document.getElementById(eleId))         .then(function (dataUrl) {            let a = document.createElement("a");             a.href = dataUrl;             a.download = "test";             a.click();         })         .catch(function (error) {            console.error("生成失败", error);         }); }; webRTC
  使用浏览器原生 API——webERT中的getDisplayMedia可以将窗口中的资源以录屏方式从其中拿出一帧,但是需要用户授权和做一些窗口选择,相比于前两种方案做不到默认截图。
  但是优势也很明显,就是不会有什么样式错乱、图片跨域等问题。因为使用的浏览器原生方法,基本上用户看到是什么样子,截图出来就是什么样子,1: 1 还原。function getDomImg(videoId: string) {    const videoElem: any = document.getElementById(videoId);    const displayMediaOptions = {        audio: false,        video: { width: window.screen.width, height: window.screen.height }, // cursor: "always"     };      navigator.mediaDevices         .getDisplayMedia(displayMediaOptions)         .then((stream) => {             videoElem.srcObject = stream;            setTimeout(() => {                var canvas = document.createElement("canvas");                 canvas.width = videoElem.clientWidth;                 canvas.height = videoElem.clientHeight;                 canvas                     .getContext("2d")                     .drawImage(                         videoElem,                        0,                        0,                        window.screen.width,                        window.screen.height,                        0,                        0,                         canvas.width,                         canvas.height                     );                var dataURL = canvas.toDataURL("image/webp");                let a = document.createElement("a");                 a.href = dataURL;                 a.download = "test";                 a.click();                let tracks = videoElem.srcObject.getTracks();                 tracks.forEach((track) => track.stop());                 videoElem.srcObject = null;             }, 200);         })         .finally(() => {}); }
  需要在代码中放入一个 Video 标签 截图后上传
  如果有将截图上传的需求,可以转换一个格式在上传。
  canvas 导出的 base64 是不可以直接上传到服务器的,所以需要转一下格式,我这边找了转换 Blob 和 file 两种格式的方法。我用的将图片转为 Blob后上传的。base64转化为Blob对象// function convertBase64ToBlob(imageEditorBase64) {    var base64Arr = imageEditorBase64.split(",");    var imgtype = "";    var base64String = "";    if (base64Arr.length > 1) {        //如果是图片base64,去掉头信息         base64String = base64Arr[1];         imgtype = base64Arr[0].substring(             base64Arr[0].indexOf(":") + 1,             base64Arr[0].indexOf(";")         );     }    // 将base64解码     var bytes = atob(base64String);    //var bytes = base64;     var bytesCode = new ArrayBuffer(bytes.length);    // 转换为类型化数组     var byteArray = new Uint8Array(bytesCode);    // 将base64转换为ascii码     for (var i = 0; i < bytes.length; i++) {         byteArray[i] = bytes.charCodeAt(i);     }    // 生成Blob对象(文件对象)     return new Blob([bytesCode], { type: imgtype }); } base64 转 formDatafunction base64ToFile(data, fileName) {    const dataArr = data.split(",");    const byteString = atob(dataArr[1]);    const options: any = {        type: "image/jpeg",        endings: "native",     };    const u8Arr = new Uint8Array(byteString.length);    for (let i = 0; i < byteString.length; i++) {         u8Arr[i] = byteString.charCodeAt(i);     }    let formData = new FormData();    let fileOfBlob = new File([u8Arr], fileName + ".jpg", options); //返回文件流     formData.append("file", fileOfBlob);    console.log("file", formData);    debugger;    return formData; } 示例
  GitHub:https://github.com/AnsonZnl/w...
  代码基于 Create React App 演示三种截图方法的基本使用方式。参考史上最详细浏览器端网页截图方案解析一款实用的前端截图工具
  javascript

为何骁龙888仍未退场?小米11体验2年,谈谈小米的应对之策记得最早购买安卓旗舰机的时候,基本上1年半,或者2年,手机基本就卡的不能用了。现在随着系统优化的加强,以及处理器性能飞速的提升,现在很多手机都可以轻松使用3年甚至更久。部分旗舰机在如何从宇宙和地理哲学层面理解落后就要挨打这句话?落后就要挨打是真理么?笔者认为落后就要挨打是人类可以当做真理来指导实践的有效规律。首先要明确的前提,真理是什么?实际上人类科学启蒙大发展也就500年的沉淀,那么,人类对宇宙规律的认自动驾驶传感器LiDAR毫米波雷达摄像机(2023年最新版本)在自动驾驶和高级驾驶辅助系统(ADAS)中,系统使用高精度摄像机和激光雷达(如激光雷达)等传感器来识别车辆周围的环境。如果人工智能(AI)是自动驾驶汽车的大脑,那么自动驾驶汽车的眼总投245亿!38个!莆田又一区域重点项目集中开竣工!最新消息2月1日,涵江区举行莆阳开春重点项目集中开竣工活动新能源汽车配套产业园莆田欧亚国际广场百威雪津啤酒有限公司糖化生产线及配套工程扩产等项目开竣工最新规划效果图曝光新年新气象,springbootredis应用封装redisTemplate工具类packagecom。hfw。basesystem。configimportjavax。annotation。ResourceimportorgIOC国际奥委会名誉委员菲利普沃尔特科尔斯逝世国际奥委会深感悲痛地获悉菲利普沃尔特科尔斯去世,享年91岁。IOC科尔斯先生代表澳大利亚参加了三届奥运会的皮划艇短距离比1960年罗马奥运会,1964年东京奥运会以及1968年墨西男篮集训分3组对抗,周琦郭艾伦一队,赵继伟二队,不见赵睿身影中国男篮正在上海集训,最近发布了一组队内分组对抗赛的照片,从照片可见,乔帅一共将阵容分为白黑红3组,周琦郭艾伦等主力算是一队,赵继伟王哲林等球员算是二队,胡金秋吴前等球员算是三队,夜深了,还是睡不着,满脑子都是你的样子头条创作挑战赛明明很想你,却再也找不到理由去见你,缘分许了我们一场相遇,可是又不能让我们在一起,孤单的夜里,空中蔓延着我对你的想念。夜深了,还是睡不着,满脑子都是你的样子,这世上总钱志亮对孩子不耐烦时,默念这三句话,很有用!很多父母与孩子沟通时,缺的不是爱,而是耐心。曾经看过这样一则公益视频节目组对几组家庭进行了一次真实的测试,看看人们语气不善时,是怎么伤害到亲人的。视频中,两个孩子打电话问爸爸什么时chatGPT帮孩子辅导作业,成为了宝妈们的工具?一GPT帮孩子辅导作业的背景1孩子在学习过程中,有时会遇到一些困难,家长们可能也无能为力。2现在科技发达,有很多先进的技术和工具,可以帮助孩子更好地辅导作业。3GPT(Genera请看,这份超500位家长开出的亲子阅读书单中国新闻出版广电报作者章红雨尹琨孙海悦李美霖新春正是读书时。兔年春节前夕,中国新闻出版广电报推出了春节假期亲子阅读情况家长调查问卷。在1月17日至27日共11天时间里,我们共收到来
网红男模特莱昂纳多汉娜阿兹拉克,大胆造型成功引起关注最近,网红男模特LeonardoHannaAzrak(莱昂纳多汉娜阿兹拉克)出席了一场西班牙版VOGUE举办的活动,凭借他大胆敢想敢干的穿衣风格成功出圈。这场活动其实是VOGUE致今日开幕上海合作组织国家多功能经贸平台总干事胡开强偕平台秘书处出席开幕式。数字经济领域是当前科技创新最为活跃的领域之一,互联网大数据云计算人工智能区块链等数字技术加快创新,推动世界经济向数刘强东再次强势发言,依然是京东集团的绝对掌舵人2017年的那届乌镇互联网大会上,那时候刘强东意气风发,刘强东在会上发言表示国内已经有一部分人富裕起来了,很富有,富到了挣钱一个亿都算是小目标了,富到了赚几十亿都会觉得很痛苦的地步继被罚13。41亿税款后,薇娅再被罚款,依旧无法阻挡她的发财之路说到薇娅,全中国几乎没有几个人不认识,曾经带货一姐的带货能力,让无数主播羡慕不已,就连一些明显大咖都纷纷到她直播间赚人气,甚至连刘德华这样的天王都对她刮目相看,然而因为偷税漏税,让45岁夏奇拉被曝偷税面临最高8年监禁被索税款罚金超2。6亿45岁的拉丁天后夏奇拉在这个夏天结束了他和皮克长达12年的情侣关系,两人正在争夺孩子的抚养权。据媒体报道,夏姐最近又遇上了烦心事,西班牙税务部门正在调查关于夏奇拉偷税的可能,如果被大衣哥补交3500万税款?经纪人这事和我无关,做好自己的事就好近日,有网友举报大衣哥偷税漏税的电话录音曝光在网络上。录音中该网友自称是举报朱之文偷税漏税的人,向山东省国税监察局询问举报的反馈信息。接电话的一名工作人员说已经接收了这位网友举报的偷逃税款!学而思被罚近日,烟台市芝罘区学而思培训学校有限公司偷逃税款12231。34元,其行为涉嫌违反了税收征收管理法第六十三条第一款之规定,被国家税务总局烟台市税务局第一稽查局处以罚款6115。67陈赫又出事了!女网友实名制举报他偷逃税款,自曝曾遭到恐吓威胁01。hr唐山烧烤摊事件爆发后,国内又连续出现了几起网友实名举报事件,其中,网友们最关注的当属演员陈赫被实名举报偷税漏税一事!陈赫,男,1985年11月9日出生于福州市长乐市,毕业增值税附加税个人所得税统统都免,不需要缴纳税款?了解税收优惠政策二三谢为你解答!增值税和所得税一直以来都是企业需要缴纳的税种中,税负压力最大的两项税种,所以企业想要减轻企业的税负压力,首先要解决的就是增值税和所得税。在个体工商户印度称将追缴小米65。3亿卢比税款,小米回应文观察者网周弋博据印度商业在线消息,当地时间1月5日,印度财政部发布声明称,印度税务情报局(DRI)已向小米科技印度公司(以下简称小米印度)发出通知,向该公司追缴逃税65。3亿卢比历史上真有济公这个人吗,他是真的很邋遢吗冬日生活打卡季济公,首先历史上呢,确有其人。只不过在历史上,济公这个人开始的时候并不出名。直到他死后,济公才在民间流传。济公是人们对宋朝释道济的尊称。济公的原名叫李修元,他原本是唐