canvas二三事之签名板与视频绘制
今天,不知道怎么的就点开了语雀,然后就看到了《HTML5 Canvas 教程》,开始了canvas的研究(学习)之旅。
首先,想到的第一个东西就是签名板,上代码:
<canvas id="canvas" width="600" height="600"></canvas>
<button onclick="clearCtx()">clear</button>
var canvas = document.querySelector('#canvas');
var ctx = canvas.getContext('2d');
var canWrite = false; //是否可以写的状态
canvas.addEventListener('mousedown', function(e){
canWrite = true;
ctx.beginPath();
ctx.moveTo(e.offsetX, e.offsetY);
ctx.lineTo(e.offsetX, e.offsetY);
ctx.lineWidth = 5;
ctx.lineCap = 'round'
ctx.stroke();
})
canvas.addEventListener('mousemove', function(e){
//这里必须是按下鼠标再移动的时候才能划线
if(canWrite){
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
}
})
canvas.addEventListener('mouseup', function(e){
canWrite = false;
})
canvas.addEventListener('mouseleave', function(e){
canWrite = false;
})
//清除画布
function clearCtx(){
ctx.clearRect(0, 0, canvas.width, canvas.height)
}
大致方法就是这样,移动端的话修改一下对应的事件就行了,这是今天的第一个demo。
然后继续学习,看到了createPattern填充纹理,这里canvas填充图片,这里也是语雀的一个例子:
<canvas id="canvas" width="600" height="600"></canvas>
var canvas = document.querySelector('#canvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = "http://airing.ursb.me/edu8-1.jpg";
img.onload = function(){
var pattern = ctx.createPattern(img, "repeat");
ctx.fillStyle = pattern;
ctx.fillRect(0,0,600,600);
}
emmm,真香!
然后我前几天看到了canvas绘视频,刚好createPattern第一个参数也可以是video对象,索性就探索了一波,然后碰壁了。。。
大概意思就是createPattern它绘画的是源视频,而源视频是1920*1080,目标canvas对象的尺寸是600*600,所以绘画出来就只能画到源视频的一部分,让人头痛。
然后采用的第二种方案,drawImage!完美。
<canvas id="canvas" width="600" height="600"></canvas>
<button onclick="playVideo()">play</button>
<button onclick="stopVideo()">stop</button>
//获取canvas对象
var canvas = document.querySelector("#canvas");
//获取context
var ctx = canvas.getContext("2d");
//画布开始的x,y坐标
var startX = 0;
var startY = 0;
//创建video对象
var video = document.createElement("video");
//这里借用阿里云的视频
video.src = "https://videocdn.taobao.com/oss/taobao-ugc/c70d06b360964d9a8500f85213ea7238/1483532956/video.mp4";
video.preload = "preload";
video.autoplay = "autoplay";
video.muted = true;
video.loop = true; var interval = null;
var videoWidth = canvas.width;
var videoHeight = canvas.height;
//视频加载完成获取视频原始宽高
video.onloadeddata = function() {
//做视频缩放
if (video.videoWidth > canvas.width || video.videoHeight > canvas.height) {
if (video.videoWidth / video.videoHeight > canvas.width / canvas.height) {
videoWidth = canvas.width;
videoHeight = Math.round(
canvas.width * (video.videoHeight / video.videoWidth)
);
startX = 0;
startY = (canvas.height - videoHeight) / 2;
} else {
videoWidth = Math.round(
canvas.height * (video.videoWidth / video.videoHeight)
);
videoHeight = canvas.height;
startX = (canvas.width - videoWidth) / 2;
startY = 0;
}
}
//根据缩放设置视频新的宽高
video.width = videoWidth;
video.height = videoHeight;
}; function playVideo() {
//画视频
ctx.drawImage(video, startX, startY, video.width, video.height)
interval = requestAnimationFrame(playVideo)
video.play();
} function stopVideo() {
cancelAnimationFrame(interval)
interval = null;
}
codepen地址:https://codepen.io/anon/pen/VNNOyw
不由得感叹一句:啊,canvas,真香!
canvas二三事之签名板与视频绘制的更多相关文章
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
- canvas二:绘制圆和其他曲线
1.绘制圆 绘制圆是canvas里面不可缺少的功课,而且绘制圆在canvas中的用处很多,好嘞,开扯 绘制圆需要用到arc这个方法: arc(X坐标,Y坐标,半径,起始弧度,结束弧度,旋转方向): 弧 ...
- 【带着canvas去流浪(7)】绘制水球图
目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...
- 【带着canvas去流浪】(2)绘制折线图
目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...
- Java并发编程二三事
Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...
- linux杂记(十二?) 关于账号和密码的二三事
关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...
- MySQL5.7关于密码二三事
MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...
- Java中的匿名内部类及内部类的二三事
匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...
- Emacs 启动优化二三事
Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...
随机推荐
- grpc的数据包监控
CommView是一个专门为网络管理员,安全专家,网络程序员,以及任何想要全面了解一台个人电脑或一个网段中的网络通信量的用户设计的强大的网络监控器和分析器,不过它支持Win系统. 我这里用的 Comm ...
- 工厂模式的认识(GOF23)
---恢复内容开始--- 对于所有的设计模式来说,其本质是哪里变化封装哪里.寻找变化点,没有万能的模式,只有适合情况的应用 工厂模式从简单工厂开始演化 1.简单工厂的主要作用在于从源头开始封装实例化, ...
- UOJ46. 【清华集训2014】玄学
传送门 Sol 考虑对于操作时间建立线段树,二进制分组 那么现在主要的问题就是怎么合并信息 你发现一个性质,就是每个修改只会在整个区间内增加两个端点 那么我们二进制分组可以得到每个区间内最多只有区间长 ...
- HTML5 Web存储 页面间进行传值
在实际使用过程中,经常会遇到需要在页面间进行传值的情况,最初设想一定需要后端才能进行数据的存储和读取,或者在本地使用一个cookie进行保存,直到了解到HTML5 Web存储 使用HTML5的新特性可 ...
- 服务器学习笔记之servlet
初衷 想学习下服务器这边的知识,制定了一条学习路线:java8--->servlet--->springMvc--->springBoot--->springCloud.在此当 ...
- ThreeJS geometry的顶点世界坐标
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 转:drupal sql查询count
Count queries Count queries Any query may have a corresponding "count query". The count qu ...
- javascript实现数据结构: 树和森林
树的3种常用链表结构 1 双亲表示法(顺序存储结构) 优点:parent(tree, x)操作可以在常量时间内实现 缺点:求结点的孩子时需要遍历整个结构 用一组连续的存储空间来存储树的结点,同时在每个 ...
- Java学习笔记(5)----使用正则表达式解决Google Code Jam Qualification2009赛题 Alien Language
原题地址:https://code.google.com/codejam/contest/90101/dashboard#s=p0 题目描述: Problem After years of study ...
- C# 后台解析json,简单方法 字符串序列化为对象,取值
如果后台是一个JSON的字符串格式如下: string str = "{\"Success\":true,\"Msg\":\"成功!\&qu ...