预览地址:http://pengchenggang.gitee.io/canvas-screenshot/

参考资料:https://www.canvasapi.cn/

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CanvasScreenshot</title>
</head> <body>
<div style="height: 50px;">
gitee 上面 不能播放视频,所以换成图片 原理一样,用鼠标框取图片内容
</div>
<div style="position: relative; height: 477px;">
<img id="imgId" style="position: absolute;" src="Picture.jpg" width="848" height="477" />
<!-- <video id="videoId" src="1920.mp4" autoplay style="position: absolute;width:848px; height: 477px;"></video> -->
<canvas id="canvasId" style="position: absolute;" width="848" height="477"></canvas>
</div>
<div style="clear: both;"></div>
<canvas id="canvasShot" style="display: none;" width="1920" height="1080"></canvas>
<img id="showPic" />
<script>
var img, cid, ctx
var _x1, _y1, _x2, _y2
var drawing = false
var offset = 0
var picSizeW
var picSizeH function main() {
/** @type {HTMLCanvasElement} */
img = document.getElementById("imgId")
cid = document.getElementById("canvasId")
ctx = cid.getContext("2d")
ctx.lineWidth = 2;
ctx.strokeStyle = "#c72e1e"; cid.addEventListener('click', function (e) {
console.info('cid is click', e)
var x = e.layerX
var y = e.layerY
// console.info("x is %s, y is %s", x, y)
})
cid.addEventListener("mousedown", function (e) {
// console.info('cid is mousedown', e)
if (drawing) {
drawing = false
return
}
_x1 = e.layerX - offset
_y1 = e.layerY - offset
drawing = true
// render()
})
cid.addEventListener("mouseup", function (e) {
// console.info('cid is mouseup', e)
drawing = false
if (_x2 < _x1) {
var t = _x2
_x2 = _x1
_x1 = t
}
if (_y2 < _y1) {
var t = _y2
_y2 = _y1
_y1 = t
}
picSizeW = _x2 - _x1
picSizeH = _y2 - _y1
if (picSizeW > 2 && picSizeH > 2) {
console.info('图片宽高均大于2px,认为可以执行截屏操作')
getShot()
} else {
ctx.clearRect(0, 0, 848, 477);
}
})
cid.addEventListener("mousemove", function (e) {
_x2 = e.layerX - offset
_y2 = e.layerY - offset
render()
})
cid.oncontextmenu = function (ev) {
ev.preventDefault();
}
} function render() {
if (!drawing) return
ctx.clearRect(0, 0, 848, 477);
// ctx.drawImage(img, 0, 0, 800, 300)
ctx.fillStyle = 'rgba(225,225,225,0.5)';
ctx.fillRect(0, 0, 848, 477);
var w = _x2 - _x1
var h = _y2 - _y1
ctx.clearRect(_x1, _y1, w, h);
ctx.strokeRect(_x1, _y1, w, h);
} function getShot() {
var canvasShotId = document.getElementById("canvasShot")
var csId_ctx = canvasShotId.getContext('2d')
var vId = document.getElementById("imgId") canvasShotId.width = 1920;
canvasShotId.height = 1080;
csId_ctx.drawImage(vId, 0, 0, 1920, 1080)
var n = getRealParams(_x1, _y1, _x2, _y2)
var imageData = csId_ctx.getImageData(n._x1, n._y1, n.picSizeW, n.picSizeH)
canvasShotId.width = n.picSizeW;
canvasShotId.height = n.picSizeH;
csId_ctx.putImageData(imageData, 0, 0) // , 0, 0, n.picSizeW, n.picSizeW)
var image = canvasShotId.toDataURL('image/jpeg', 0.8)
var showPicRef = document.getElementById("showPic")
showPicRef.src = image
} function getRealParams(x, y, x2, y2) {
console.info('x, y, x2, y2', x, y, x2, y2)
var _x = x / 848 * 1920
var _y = y / 477 * 1080
var _x2 = x2 / 848 * 1920
var _y2 = y2 / 477 * 1080
var ret = {
_x1: _x,
_y1: _y,
picSizeW: _x2 - _x,
picSizeH: _y2 - _y
}
console.info('ret', ret)
return ret
}
main()
</script>
</body> </html>

canvas-screenshot 视频截屏功能,选择视频的一个区域,进行截图的更多相关文章

  1. 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成

    3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...

  2. PhantomJS linux系统下安装步骤及使用方法(网页截屏功能)

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  3. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  4. iOS截屏功能

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  5. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  6. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制 ...

  7. Mac下的截屏功能

    全屏截图 对全屏的截图我们可以通过按 苹果键(花键)+Shift键+3来执行,之后伴随着清脆的一声提示音后,在桌面上就会生成一个图片文件,这就是刚刚截屏的图片了,默认文件类型是PNG的. 自定义截图 ...

  8. 使用laravel框架与phantomjs实现截屏功能

    在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行.因此我想要实现输入网址即可截屏并输出图片的功能.示例:http://120.77.171.182 ...

  9. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...

  10. 小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

    1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值假设是有小数位(如0.5),就会造成显示模糊,所以不妨用整数值的origin. ...

随机推荐

  1. 8.5 CheckRemoteDebuggerPresent

    CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用.函数接收两个参数进程句柄和一个指向布尔值的指针.如果指定的进程正在被调试,则函数 ...

  2. Odoo16—即时通信模块discuss

    odoo中自带的discuss模块是一个简易版的即时通信系统,虽然简单,但是功能还是挺强劲的.可以发送图文消息,可以语音,可以视频,也可以共享屏幕,看下效果吧! PC端效果 手机端效果 重点说明 没错 ...

  3. MySQL主主同步环境出现1236错误

    环境: MySQL 5.7.25 主主架构 故障现象: 发现互相之间的同步均发生异常,两端均出现1236错误,在两个主节点上分别执行show slave status显示的关键信息如下: Master ...

  4. NC14699 队伍配置

    题目链接 题目 题目描述 萌学姐在玩大型手游<futa go>,他现在准备进入作战环节,所以他准备安排自己的队伍. 队伍配置里,可供玩家选择的作战人物被称作"从者",玩 ...

  5. MQTT-基础理念

    MQTT与HTTP的区别 HTTP协议是客户端与服务端直连请求与响应 MQTT是基于发布订阅模型的轻量级的消息传输协议 MQTT能力 发布:Publish 订阅:Subscribe 代理:Broker ...

  6. Typora 快捷方式给字体设置颜色

    1.下载并安装 AutoHotkey (具体步骤可自行百度) 访问 AutoHotkey 主页: https://autohotkey.com/ 点击下载: https://autohotkey.co ...

  7. 使用CNN实现MNIST数据集分类

    1 MNIST数据集和CNN网络配置 关于MNIST数据集的说明及配置见使用TensorFlow实现MNIST数据集分类 CNN网络参数配置如下: 原始数据:输入为[28,28],输出为[1,10] ...

  8. 实操开源版全栈测试工具RunnerGo安装(二)Linux安装

    手动安装(支持Linux.MacOS.Windows) Linux安装步骤 以debian系统为例,其他linux系统参考官方文档:https://docs.docker.com/engine/ins ...

  9. IDA 反汇编 explorer

    之前写过一篇关于 IDA 在无 dmp 文件下如何定位到崩溃点的文章,由于其中涉及到公司项目,就仅限自己看了 正好今天看到一篇关于火绒软件误杀 explorer 的文章,并且有相关的复现过程 文章已经 ...

  10. ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图

    我个人觉得这是ASP.NET Core MVC框架体系最核心的部分.原因很简单,MVC框架建立在ASP.NET Core路由终结点上,它最终的目的就是将每个Action方法映射为一个或者多个路由终结点 ...