今天,不知道怎么的就点开了语雀,然后就看到了《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二三事之签名板与视频绘制的更多相关文章

  1. 基于canvas二次贝塞尔曲线绘制鲜花

    canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...

  2. canvas二:绘制圆和其他曲线

    1.绘制圆 绘制圆是canvas里面不可缺少的功课,而且绘制圆在canvas中的用处很多,好嘞,开扯 绘制圆需要用到arc这个方法: arc(X坐标,Y坐标,半径,起始弧度,结束弧度,旋转方向): 弧 ...

  3. 【带着canvas去流浪(7)】绘制水球图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...

  4. 【带着canvas去流浪】(2)绘制折线图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...

  5. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  6. linux杂记(十二?) 关于账号和密码的二三事

    关于密码的二三事 关于账号和密码的二三事 久了不更linux的相关知识,实在是懒得想内容点(纯粹是懒).那么今天就来谈谈关于linux密码和账号的重要概念. 假如你的主机遭到入侵,那么对方的第一个侵入 ...

  7. MySQL5.7关于密码二三事

    MySQL5.7关于密码二三事 第一个:update user set password=password('root') where user='root' and host='localhost' ...

  8. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  9. Emacs 启动优化二三事

    Emacs 启动优化二三事 */--> div.org-src-container { font-size: 85%; font-family: monospace; } p {font-siz ...

随机推荐

  1. Java学习--Jsp简介

  2. Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)

    二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...

  3. Oracle数据库RowId

    RowId是什么? RowId是根据每一行数据的物理信息地址编码而成的一个位列,利用RowId可以快速定位到某一行. Oracle数据库编辑数据必须查出RowId,可以根据如下语句查询: select ...

  4. [SHOI2007]园丁的烦恼

    裸的二维数点 #include"cstdio" #include"cstring" #include"iostream" #include& ...

  5. Sublime Text3之安裝Emmet及使用技巧

    首先准备工作: 如果你的Sublime Text3没有Package Control组件先看一下这里,如果以安装请忽略: 1.按Ctrl+`调出sublime text的console 2.粘贴以下代 ...

  6. 面向对象第四章(封装、static)

    1.package: 1)作用:避免类名的冲突 2)包名可以有层次结构 3)类的全称: 包名.类名,同包中的类不能同名 4)建议:包名所有字母都小写 import: 1)同包中的类可以直接访问, 不同 ...

  7. VUE配置项结构

    VUE配置项结构 config:项目的配置文件 index.js: 基础的配置信息 dev.env.js:开发环境配置信息 prod.env.js:线上环境配置信息 build: 项目打包所需要的内容 ...

  8. 【转载记录】Accessing Device Drivers from C#

    来源:http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/   Device Drivers are writte ...

  9. GNU工具 ar

    1.ar基本用法 ar命令可以用来创建.修改库,也可以从库中提出单个模块.库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member).原始文件的内容.模式.时间戳 ...

  10. django定义Model中的方法和属性

    #定义一个Model class UserProfile(models.Model): user=models.OneToOneField(User,unique=True) phone=models ...