html基于canvas实现截图的介绍-
写在最前
记得之前在人人上看到一个分享,解说基于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属性,当会员点击之后就可以直接进行下载。
部署
依赖项
打赏