您现在的位置是:网站首页> 编程资料编程资料
html 基于 canvas 实现的一个截图小demo使用html2canvas实现浏览器截图的示例代码html5使用html2canvas实现浏览器截图的示例canvas与html5实现视频截图功能示例Html5新特性用canvas标签画多条直线附效果截图HTML5在canvas中绘制复杂形状附效果截图HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)video结合canvas实现视频在线截图功能
2021-08-29
1501人已围观
简介 本篇文章主要介绍了html 基于 canvas 实现的一个截图小demo,具有一定的参考价值,有兴趣的可以了解一下
写在最前
记得以前在人人上看到一个分享,讲解基于js的截图方案,详细的不记得了,只记得还挺有意思的貌似用了canvas?所以这次打算自己写一个分享给大家作者的思路。这只是一个很简陋的小demo如有bug请提issues。按照惯例po代码地址。
效果图

整体思路
- 设置开始/结束快捷键
- 开始后将DOM绘制成canvas来覆盖原始DOM界面
- 添加一张canvas模拟鼠标截图区域
- 添加一张canvas用来绘制鼠标截图区域对应的浏览器界面(从第一张canvas中截取)
- 保存截取的图像
1.设置开始/结束快捷键
由于快捷键可能导致的冲突故希望开始快捷键可以不限定快捷键数量,所以在第一个参数中采用了数组的形式进行传递。
function screenShot(quickStartKey, EndKey) { //兼容性考虑不使用...扩展字符串 var keyLength = quickStartKey.length var isKeyTrigger = {} var cantStartShot = false ... quickStartKey.forEach(function(item) { //遍历参数数组 isKeyTrigger[item] = false //默认数组中所有键都没有触发 }) $('html').on('keyup', function(e) { var keyCode = e.which if(keyCode === EndKey) { ... } else if(!cantStartShot) { isKeyTrigger[keyCode] = true var notTrigger = Object.keys(isKeyTrigger).filter(function(item) { return isKeyTrigger[item] === false //查看有没有需要触发的快捷键 }) if(notTrigger.length === 0) { //没有需要触发的快捷键即可以开始截图 cantStartShot = true beginShot(cantStartShot) } } }) 2.将的DOM绘制成canvas来覆盖原始DOM界面
如果采用原生的方法可以参照MDN下对于在canvas中绘制DOM的介绍。里面最棘手的地方是你需要创建一个包含XML的SVG图像涉及到的元素为
function beginShot(cantStartShot) { if(cantStartShot) { html2canvas(document.body, { onrendered: function(canvas) { //得到与界面一致的canvas图像 } }) } }3.添加一张canvas模拟鼠标截图区域
这个地方的实现本来打算使用原生canvasAPI,但是里面涉及到一个问题就是在鼠标按下开始拖拽后,canvas要实时绘制,这里面就要引出一个类似于PS图层的概念,每当mousemove的时候都画出一个当前的截图框,但是当下一次触发mousemove的时候就删掉上一个截图框。以此来模拟实时的绘制过程。无奈作者没有找到使用canvas原生API的方法,如果有的话一定告诉我如何对画出的图做出标记。在这里作者使用了一个基于Jq的canvas的库叫做Jcanvas,里面给出了图层的概念,即在一个图层上只能画一张图,同时可以给图层标记名称。这就满足了作者的需求,实现如下:
$('#' + canvasId).mousedown(function(e) { $("#"+canvasId).removeLayer(layerName) //删除上一图层 layerName += 1 startX = that._calculateXY(e).x //计算鼠标位置 startY = that._calculateXY(e).y isShot = true $("#"+canvasId).addLayer({ type: 'rectangle', //矩形 ... name:layerName, //图层名称 x: startX, y: startY, width: 1, height: 1 }) }).mousemove(function(e) { if(isShot) { $("#"+canvasId).removeLayer(layerName) var moveX = that._calculateXY(e).x var moveY = that._calculateXY(e).y var width = moveX - startX var height = moveY - startY $("#"+canvasId).addLayer({ type: 'rectangle', ... name:layerName, fromCenter: false, x: startX, y: startY, width: width, height: height }) $("#"+canvasId).drawLayers(); //绘制 } }) 4.添加一张canvas用来绘制鼠标截图区域对应的浏览器界面
var canvasResult = document.getElementById('canvasResult') var ctx = canvasResult.getContext("2d"); ctx.drawImage(copyDomCanvas, moveX - startX > 0 ? startX : moveX, moveY - startY > 0 ? startY : moveY, width, height, 0, 0, width, height ) var dataURL = canvasResult.toDataURL("image/png");其中通过drawImage截取了图像,再使用toDataURL方法将图像转换为了base64编码
5.保存截取的图像
function downloadFile(el, fileName, href){ el.attr({ 'download':fileName, 'href': href }) } ... downloadFile($('.ok'), 'screenShot' + Math.random().toString().split('.')[1] || Math.random() + '.png', dataURL) // 传入按键对象、图像保存随机名、base64编码的图像其中用到了a标签的download属性,当用户点击之后就可以直接进行下载。
部署
依赖项
配置快捷键
screenShot([16, 65], 27) // 开始快捷键设置为shift+a;退出键为ESC
最后
文中最恶心的地方(DOM写入canvas、canvas设置图层)分别采用了两个库来进行实现,后续作者还会陆续关注如何使用原生API来实现这些操作,虽然个人认为自己写还是有点。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关内容
- HTML中表格动态添加_动力节点Java学院整理jQuery JSON动态获取表格数据特效源码Excel表格中怎么制作一个柱形动态图表?Excel表格中怎么制作带复选框的动态图表?jquery实现的超帅动态表格交叉变色高亮显示效果WPS为查看费力多数据表格改为动态数据显示技巧步骤Sigma Grid实现ajax动态表格(支持分页、列宽拖动、数据排序)用Excel管理表格 制作动态表头
- Html中使用自定义图片来实现checkbox显示的方法HTML5实现的自定义Checkbox和Radiobox 很酷的选中动画效果源码通过jQuery实现自定义可以替代html自带的checkbox和radioboxCSS+HTML自定义checkbox效果的实例代码
- html中关于form与表单提交操作的资料集合HTML表单提交的几种方式_动力节点Java学院整理HTML5利用约束验证API来检查表单的输入数据的代码实例基于HTML实现表单提交后不刷新页面 html form表单提交action和url跳转到actiond的区别介绍html中表单提交的实现
- 浅谈HTML的语义化和一些简单优化HTML5语义化元素你真的用对了吗HTML5新特性之语义化标签HTML5中语义化 b 和 i 标签HTML5 语义化结构化规范化HTML标签语义化(含H5) 详解HTML5常用的语义化标签浅谈语义化的HTML结构到底有什么好处使用语义化标签去写你的HTML 兼容IE6,7,8HTML标签语义化的介绍XHTML标签语义化介绍
- HTML中的5种空格各表示的意义HTML大于号、小于号、空格、引号等常用的转义代码写法一览表探讨HTML不同空格的特性与表现形式(推荐)浅谈HTML代码中的空格和空行浅析html 空格代码HTML/CSS中的空格处理及如何保留页面中的空格
- 5种做法实现table表格中的斜线表头效果 纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- HTML标签meta总结,HTML5 head meta 属性整理HTML常用meta大全(推荐)移动端专用的meta标签设置大全HTML中的<meta>标签的使用详解html中meta标签及用法详解dreamweaver cs5不写写代码怎么添加meta标签?HTML5各种头部meta标签的功能(推荐)HTML中meta标签及Keywords
- HTML meta 详解纯html+css实现Element loading效果纯html+css实现奥运五环的示例代码HTML+CSS实现导航条下拉菜单的示例代码html+css实现滚动到元素位置显示加载动画效果纯html+css实现打字效果html+css实现环绕倒影加载特效html输入两个数实现加减乘除功能html中显示特殊符号(附带特殊字符对应表)关于html选择框创建占位符的问题html css3不拉伸图片显示效果
- HTML基础控件介绍_动力节点Java学院整理HTML input file控件限制上传文件类型_动力节点Java学院整理详解HTML5中表单验证的8种方法介绍HTML中禁用表单控件的两种方法readonly与disabled使用css美化html表单控件详细示例(表单美化)dhtmlxGrid Ajax表格、日历、工具条控件仿163网盘无刷新文件上传 for Php
- HTML name id和class的区别_动力节点Java学院整理HTML name、id、class 的(格式/应用场景/特性)等区别介绍HTML语言大全
