用JavaScript实现浏览器截图功能的全过程_javascript技巧

最近项目中要实现一个需求: 

用户希望在上传文件时能够直接截图上传,并且要求能够截图浏览器外的内容。

多方查找之下找到了类似的解决方案,但个人感觉操作上有些抽象,仅供参考。

const startButton = document.getElementById('start-screenshot'); // 开始截图按钮const screenshotContainer = document.getElementById('screenshot-container'); // 获取的图片展示区const canvas = document.getElementById('screenshot-canvas'); // canvasconst ctx = canvas.getContext('2d');const selectionArea = document.getElementById('selection-area'); // 截图区域const toolbar = document.getElementById('screenshot-toolbar'); // 截图时右下角的小弹框const confirmButton = document.getElementById('confirm-screenshot'); // 确认按钮const cancelButton = document.getElementById('cancel-screenshot'); // 取消按钮

变量定义

function updateSelectionArea() { const width = Math.abs(endX - startX); const height = Math.abs(endY - startY); const left = Math.min(startX, endX); const top = Math.min(startY, endY); selectionArea.style.display = 'block'; selectionArea.style.left = left + 'px'; selectionArea.style.top = top + 'px'; selectionArea.style.width = width + 'px'; selectionArea.style.height = height + 'px'; // 更新工具栏位置 toolbar.style.display = 'flex'; toolbar.style.left = (left + width + 5) + 'px'; toolbar.style.top = (top + height + 5) + 'px';}

确认截图(在这里获取截图结果)

function confirmScreenshot() { if (!isCapturing) return; const width = Math.abs(endX - startX); const height = Math.abs(endY - startY); const left = Math.min(startX, endX); const top = Math.min(startY, endY); // 创建新画布以保存选定区域 const resultCanvas = document.createElement('canvas'); resultCanvas.width = width; resultCanvas.height = height; const resultCtx = resultCanvas.getContext('2d'); // 将选定区域绘制到新画布 resultCtx.drawImage( canvas, left, top, width, height, 0, 0, width, height ); // 在这里获取截图结果 // 如果想生成成一个Base64url const base64Url = resultCanvas.toDataURL(); // 如果想生成成一个file对象 const resultFile = dataURLtoFile(resultCanvas.toDataURL(), "截图.png") // 重置截图状态 resetScreenshot();}

将Base64数据转换为File对象(不需要转换结果为文件对象可以不写这段)

function dataURLtoFile(dataurl, filename) { // 将Base64数据拆分为MIME类型和实际数据 const arr = dataurl.split(','); const mime = arr[0].match(/:(.*?);/)[1]; // 获取MIME类型 const bstr = atob(arr[1]); // 解码Base64数据 let n = bstr.length; const u8arr = new Uint8Array(n); // 将解码后的数据转换为Uint8Array while (n--) { u8arr[n] = bstr.charCodeAt(n); } // 创建并返回File对象 return new File([u8arr], filename, { type: mime });}

取消截图

// 事件监听器startButton.addEventListener('click', startScreenshot);confirmButton.addEventListener('click', confirmScreenshot);cancelButton.addEventListener('click', cancelScreenshot);// 鼠标事件处理canvas.addEventListener('mousedown', function(e) { if (!isCapturing) return; isSelecting = true; startX = e.clientX; startY = e.clientY; endX = e.clientX; endY = e.clientY; updateSelectionArea();});canvas.addEventListener('mousemove', function(e) { if (!isSelecting) return; endX = e.clientX; endY = e.clientY; updateSelectionArea();});canvas.addEventListener('mouseup', function() { isSelecting = false;});// 窗口大小改变时重新设置画布大小window.addEventListener('resize', function() { if (isCapturing) { setCanvasSize(); }});

键盘快捷键(不需要可以不用)

// 键盘快捷键document.addEventListener('keydown', function(e) { // Alt + A 开始截图 if (e.altKey && e.key === 'a') { e.preventDefault(); startScreenshot(); } // Enter 确认截图 if (e.key === 'Enter' && isCapturing) { confirmScreenshot(); } // Esc 取消截图 if (e.key === 'Escape' && isCapturing) { cancelScreenshot(); }});

姑且算是实现了这个需求,但是实现效果并不是很理想,只能说仅供参考吧

到此这篇关于用JavaScript实现浏览器截图功能的文章就介绍到这了,更多相关JS浏览器截图功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


本文地址: https://www.earthnavs.com/jishuwz/38db5ef5b41891ea3f0a.html
全局中部横幅
百度一下

全球领先的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。

CTF导航

黑客街一家做网络安全爱好者导航的web安全网站!专注Hack站点收集,为广大网络安全爱好者提供网站导航,为小白提供黑客入门网站的安全站点收集

慕课网

慕课网(IMOOC)是IT技能学习平台。慕课网(IMOOC)课程涉及JAVA、前端、Python、大数据等60类主流技术语言,覆盖了面试就业、职业成长、自我提升等需求场景,帮助用户实现从技能提升到岗位提升的能力闭环。

大鱼号官网

大鱼号是阿里文娱体系为内容创作者提供的统一账号。大鱼号实现了阿里文娱体系一点接入,多点分发。内容创作者一点接入大鱼号,上传图文/视频可被分发到UC、优酷、土豆、淘系客户端,未来还会扩展到豌豆荚、神马搜索、PP助手等。

百度新闻

百度新闻是包含海量资讯的新闻服务平台,真实反映每时每刻的新闻热点。您可以搜索新闻事件、热点话题、人物动态、产品资讯等,快速了解它们的最新进展。

seo基础知识

我们梵吉seo专注百度SEO优化领域,本站总结了seo基础入门教程,让零基础的朋友可以快速学会SEO,并提供了SEO快速进阶技术、百度云视频教程、seo面试测试题、seo实战培训。希望可以帮助到更多的新手朋友们!

飞天下载系统,FTDMS,下载系统,素材管理系统,CMS系统

下载系统-CMS内容管理,素材下载产品及解决方案提供商

秒开云

【秒开云官网】-24小时不关机系统,下载运行软件不掉线!永久便宜的挂机宝,VPS服务器,云主机,免费云电脑教程,云桌面IP,手机版APP安卓ios苹果软件皆可远程连接使用。

摩尔网CGMOL

自主上传您的3D模型作品,无限免费下载所有3D模型,分享您的3D模型制作经验,您的3D作品网络存储库,您的CG作品出售平台,模型卖钱网,3D模型共享出售中心:摩尔网

717收录网

717收录网是一个综合性的网络资源平台,专注于为用户提供便捷、全面的网址导航服务,同时提供自动审核提交收录功能,致力于为广大网友提供专业的互联网资源导航服务