电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS如何實現頁面截屏功能實例代碼

瀏覽:108日期:2024-03-22 17:58:04

'頁面截屏'是前端經常遇到的需求,比如頁面生成海報,彈窗圖片分享等,因為瀏覽器沒有原生的截圖API,所以需要借助canvas來實現導出圖片實現需求。

可行性方案 方案1: 將 DOM 改寫成 canvas ,調用canvas的toBlob或者toDataURL方法即刻上傳到七牛云或服務器 方案2: 使用第三方庫html2canvas.js實現 canvas , 在不更改頁面已有DOM的情況下優雅生產canvas解決方案的選擇

方案1:需要手動計算每個DOM元素的Computed Style,然后需要計算好元素在canvas的大小位置等屬性。

方案1難點

需要棄用已有的html頁面,改用canvas重寫。 頁面結構層復雜的情況下用canvas寫,不易重構。 有一定canvas基礎。

方案2:該項目在Github上stars已有兩萬多start,作者仍在積極維護。API非常簡單,在已有項目中開箱即用。

html2canvas

因為是常見的需求,所以社區會有成熟的解決方案,首先試試社區的解決方案。

<div style='padding: 10px; background: #f5da55'> <h4 style='color: #000; '>Hello world!</h4></div>

html2canvas(document.querySelector('#capture')).then(canvas => { document.body.appendChild(canvas)});

以上是官網的實例用法。在網頁上出現了一個新的 canvas DOM。接下來我們只需要把canvas轉換成圖片就好。這里使用canva原生的toDataURL和toBlob方法上次到七牛云。

使用時需要注意。此處如果生產的畫布中有跨域圖片,需要配置allowTaint為true。

如果是原生canvas實現,canvas需要所有跨域圖片請求完成才可繪制。有兩種解決方案

方案1:在html上寫好img標簽,src寫好對應的圖片url。缺點很明顯,會污染頁面的布局結構。 方案2:使用js,使用new Image()的方式。設置src到對應的圖片url,在onload回調中處理相關操作。優點:可行性最高,不過有回調地獄的問題。我們用Promise改寫一下

function asyncImage(url) { const img = new Image(); img.src = url; img.setAttribute(’crossOrigin’, ’anonymous’); return new Promise((resolve, reject) => {img.onload = () => resolve(img);img.onerror = reject; });}

好的,大功告成~是不是可以交付需求了呢?開開心心提測,但是在移動端測試的時候發現生產的圖片非常模糊。這樣是不行的,明顯low了許多(測試不給過orz)。

github有相應的解決方案 傳送門 ,這個回答也是解決很多人的問題

基本原理:將canvas寬高放大兩倍。把css把canvas的style設置成1倍大小。

var shareContent = YourTargetElem; var width = shareContent.offsetWidth; var height = shareContent.offsetHeight; var canvas = document.createElement('canvas'); var scale = 2 || window.devicePixelRatio ; //也可以使用設備像素比 canvas.width = width * scale; canvas.height = height * scale; canvas.getContext('2d').scale(scale, scale); var opts = {scale: scale, canvas: canvas, logging: true, width: width, height: height }; html2canvas(shareContent, opts).then(function (canvas) {var context = canvas.getContext(’2d’);var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height);document.body.appendChild(img);$(img).css({ 'width': canvas.width / 2 + 'px', 'height': canvas.height / 2 + 'px',}) });

原理我們已經知道了,實際操作之后圖像也確實清晰了很多。但是問題還是沒有解決掉。

縮小雖然提高了清晰度,但是我們需要的圖片是原始比例的大小。。

最終多次嘗試無果后,選擇放棄使用框架。直接用原生canvas擼一個!

canvas繪制

我們知道,在高清屏的設備下,任何繪制canvas中的圖像、文字、線條、形狀都可能會出現模糊的問題。可通過引入 GitHub 中的 hidpi-canvas 有效地解決。

首先去 GitHub 下載 hidpi-canvas.js 文件:傳送門; 在項目中引入 hidpi-canvas.js 文件; 調用 getPixelRatio() 函數,得到 ratio 值; 在 drawImage() 中,將 width 和 height 乘以 ratio; 最終的canvas導出為Blog,轉換成文件對象上傳七牛云。

核心代碼如下

function asyncImage(url) {const img = new Image();img.src = url;img.setAttribute(’crossOrigin’, ’anonymous’);return new Promise((resolve, reject) => { img.onload = () => resolve(img); img.onerror = reject;}); } async function drawCanvas(){var canvas = document.querySelector(’canvas’);var context = canvas.getContext(’2d’);var ratio = getPixelRatio(context); // 關鍵代碼canvas.width = 300 * ratio; // 畫布寬度canvas.height = 300 * ratio; // 畫布高度var divWidth = 300 * ratio; // 用于內容居中var divHeight = 300 * ratio; // 用于內容居中const image = await asyncImage(’picUrl’)const imgWidth = 550const imgHeight = 300context.drawImage(this, 50, 50, imgWidth * ratio, imgHeight * ratio)// Some other codeconst Blob = canvas.toBlob((Blob)=>{ //上傳七牛云}); }

最終生成的圖片終于清晰了...只需要根據dom的offsetWidth等適配不同屏幕就可以了。

總結

如果對圖片的清晰度要求不高,或者圖片需求是生成縮略圖的情況下。采用 html2canvas 是非常不錯的選擇。否則,還是用canvas繪制出的圖片更清晰。

到此這篇關于JS如何實現頁面截屏功能的文章就介紹到這了,更多相關JS頁面截屏功能內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 气胀轴|气涨轴|安全夹头|安全卡盘|伺服纠偏系统厂家-天机传动 | 微学堂-电动能源汽车评测_电动车性能分享网 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 工业洗衣机_工业洗涤设备_上海力净工业洗衣机厂家-洗涤设备首页 bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 自动化改造_智虎机器人_灌装机_贴标机-上海圣起包装机械 | 期货软件-专业期货分析软件下载-云智赢 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 震动筛选机|震动分筛机|筛粉机|振筛机|振荡筛-振动筛分设备专业生产厂家高服机械 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 山东信蓝建设有限公司官网| 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 涡街流量计_LUGB智能管道式高温防爆蒸汽温压补偿计量表-江苏凯铭仪表有限公司 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 方源木业官网-四川木门-全国木门专业品牌 | 诗词大全-古诗名句 - 古诗词赏析| 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 |