今天,不知道怎么的就点开了语雀,然后就看到了《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. Spring MVC No converter found for return value of type 解决方法

    1.在pom中添加 jackson <properties> <jackson.version>2.8.5</jackson.version> </prope ...

  2. Spring Boot学习笔记(二)全局捕获异常处理

    非常简单只需要创建自己的异常处理类,加上两个注解,就可以了

  3. JAVA基础之——JDK分析io、nio

    在哪儿:jdk\jre\lib\rt.jar package java.io;   package java.nio; 1 分类 1.1 IO 持久化序列化对象并压缩步骤 new FileOutput ...

  4. 解决:springmvc maven 项目搭建完后没有src目录,而且maven导入很慢

    前言:在搭建springmvc maven项目中遇到的问题做总结,比如搭建后没有src,同时这里也解决了搭建后maven导入很慢的问题. 问题: 1.发现创建出来的maven项目没有src文件 ,而且 ...

  5. csharp: Microsoft SqlHelper

    from: Microsoft Data Access Application Block for .NET  https://www.microsoft.com/en-us/download/con ...

  6. C# 读写txt文件方法

    添加引用: using System.IO; 1.File类写入文本文件: private void btnTextWrite_Click(object sender, EventArgs e) { ...

  7. Docker 核心概念、安装、端口映射及常用操作命令,详细到令人发指。

    Docker简介 Docker是开源应用容器引擎,轻量级容器技术. 基于Go语言,并遵循Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  8. SQL-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()

    1 SELECT orderid,custid,val, ROW_NUMBER() OVER(ORDER BY val) AS rownum, RANK() OVER(ORDER BY val) AS ...

  9. js 基于可视区域 创建展示区域对应的经纬度二维数组

    本篇文章主要是分享下基于地图区域创建经纬度二维数组,需要的朋友可以过来参考下 接上个文章, 基于 地图区域,算出这个展示区域对应的点. 经纬度的变化关系:  XY页面展示上, 从左到右维度是增加 如: ...

  10. 使用 js 实现文本过多时隐藏部分文本

    使用 js 实现文本过多时隐藏部分文本 情景描述: 有时候我们需要显示部分文字,就像 QQ 空间这样,先显示部分文字,加一个[查看全文],让用户选择是否查看全部 解决方法: 第一步:在一个 id 为 ...