canvas的其他应用
画布的基础知识
专门研究画布的大佬
手动实现echar的大佬
echar官方
画布之水印
ctx.font = "bold 20px Arial";
ctx.lineWidth = "1";
ctx.fillStyle = "rgba(255 , 255 , 255, 0.5)";
ctx.fillText("===文字===", 50, 50);
画布之滤镜
var img = new Image()
img.src = "./img/photo.jpg"
img.onload = function () {
var canvas = document.querySelector("#my-canvas");
var ctx = canvas.getContext("2d");
canvas.width = img.width
canvas.height = img.height
ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
// 开始滤镜处理
var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
for (var i = 0; i < imgData.data.length / 4; ++i) {
var red = imgData.data[i * 4],
green = imgData.data[i * 4 + 1],
blue = imgData.data[i * 4 + 2];
var gray = 0.3 * red + 0.59 * green + 0.11 * blue; // 计算gray
// 刷新RGB,注意:
// imgData.data[i * 4 + 3]存放的是alpha,不需要改动
imgData.data[i * 4] = gray;
imgData.data[i * 4 + 1] = gray;
imgData.data[i * 4 + 2] = gray;
}
ctx.putImageData(imgData, 0, 0); // 重写图像数据
}
画布之放大镜
<canvas id="my-canvas"></canvas>
<canvas id="off-canvas" style="display: none;"></canvas>
var isMouseDown = false,scale = 1.0;
var canvas = document.querySelector("#my-canvas");
var offCanvas = document.querySelector("#off-canvas"); // 离屏 canvas
var ctx = canvas.getContext("2d");
var offCtx = offCanvas.getContext("2d"); // 离屏 canvas 的 Context对象
var img = new Image();
window.onload = function() {
img.src = "./img/xxx.jpg";
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
offCanvas.width = img.width;
offCanvas.height = img.height;
// 计算缩放比例
scale = offCanvas.width / canvas.width;
// 初识状态下, 两个canvas均绘制Image
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
offCtx.drawImage(img, 0, 0, canvas.width, canvas.height);
};
// 鼠标按下
canvas.onmousedown = function(event) {
event.preventDefault(); // 禁用默认事件
var point = windowToCanvas(event.clientX, event.clientY); // 获取鼠标相对于 canvas 标签的坐标
isMouseDown = true;
drawCanvasWithMagnifier(true, point); // 绘制在离屏canvas上绘制放大后的图像
};
// 鼠标移动
canvas.onmousemove = function(event) {
event.preventDefault(); // 禁用默认事件
if (isMouseDown === true) {
var point = windowToCanvas(event.clientX, event.clientY);
drawCanvasWithMagnifier(true, point);
}
};
// 鼠标松开
canvas.onmouseup = function(event) {
event.preventDefault(); // 禁用默认事件
isMouseDown = false;
drawCanvasWithMagnifier(false); // 不绘制离屏放大镜
};
// 鼠标移出canvas标签
canvas.onmouseout = function(event) {
event.preventDefault(); // 禁用默认事件
isMouseDown = false;
drawCanvasWithMagnifier(false); // 不绘制离屏放大镜
};
};
/**
* 返回鼠标相对于canvas左上角的坐标
* @param {Number} x 鼠标的屏幕坐标x
* @param {Number} y 鼠标的屏幕坐标y
*/
function windowToCanvas(x, y) {
var bbox = canvas.getBoundingClientRect(); // bbox中存储的是canvas相对于屏幕的坐标
return {
x: x - bbox.x,
y: y - bbox.y
};
}
function drawCanvasWithMagnifier(isShow, point) {
ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 在画布上绘制图像
/* 利用离屏,绘制放大镜 */
if(isShow){
var { x, y } = point;
var mr = 50; // 正方形放大镜边长
// (sx, sy): 待放大图像的开始坐标
var sx = x - mr / 2,sy = y - mr / 2;
// (dx, dy): 已放大图像的开始坐标
var dx = x - mr,dy = y - mr;
// 将offCanvas上的(sx,sy)开始的长宽均为mr的正方形区域
// 放大到
// canvas上的(dx,dy)开始的长宽均为 2 * mr 的正方形可视区域
// 由此实现放大效果
ctx.drawImage(offCanvas, sx, sy, mr, mr, dx, dy, 2 * mr, 2 * mr);
}
}
画布之刮刮乐
<div class="container" id="container">
<div id="box">一等奖</div>
<canvas id="canvas">需要定位到box上面</canvas>
</div>
var canvas = document.querySelector("#canvas");
canvas.width = box.offsetWidth;
canvas.height = box.offsetHeight;
let context = canvas.getContext('2d');
//背景填充色
context.fillStyle = '#ccc';
context.fillRect(0, 0, box.offsetWidth, box.offsetHeight);
//把灰色矩形当做目标对象 然后线当做源对象
//destination-out 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。
//destination-in 在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。
context.globalCompositeOperation = 'destination-out';
canvas.addEventListener("touchstart", function (e) {
context.beginPath();
context.moveTo(e.touches[0].pageX, e.touches[0].pageY);
context.lineWidth = 20;
context.lineCap = 'round';
context.lineJoin = 'round';
canvas.addEventListener("touchmove", function (e) {
context.lineTo(e.touches[0].pageX, e.touches[0].pageY);
context.stroke();
})
canvas.addEventListener("touchend", function (e) {
context.closePath();
})
})
画布之图表
- echar框架就是牛逼,圆柱,饼图,折线图,曲线图,地图,热力图等等
- 各大地图厂家,百度地图,腾讯地图等等
画布之动画和游戏
有很多的JS游戏引擎,游戏引擎是什么
这个太高端,原理是用一个很大的对象存放画面上所有物体的位置和大小,用计时器去清空页面再绘制页面,给画布添加点击事件判断位置,可以搜索一些画布做的打飞机,贪吃蛇,象棋游戏看一下源码
饼图
var all = 11;
var arr = [["green",5],["red",6]]
var startAngle = 0;
arr.forEach(function (opt) {
var endAngle = startAngle + opt[1]/all * Math.PI * 2; //结束弧度
var cenAngle = startAngle + opt[1]/all * Math.PI; //中间线孤独
ctx.beginPath();
ctx.moveTo(0,0); //移动到到圆心
ctx.fillStyle = opt[0];
ctx.arc(0, 0 , windowW/3, startAngle,endAngle, false);
ctx.fill();
var x = windowW/3 * Math.cos(cenAngle),//圆弧上线与圆相交点的x坐标
y = windowW/3 * Math.sin(cenAngle);//圆弧上线与圆相交点的y坐标
x = x<0 ? x-20 : x+20;
y = y<0 ? y-20 : y+20;
ctx.beginPath();
ctx.strokeStyle = colorObj[opt[0]];
ctx.moveTo(0,0);
ctx.lineTo(x,y);
ctx.lineTo(x+20,y);
ctx.font = "14px Times New Roman";
ctx.fillText(((opt[1]/all)*100).toFixed(1)+'%',x+20,y);
ctx.stroke();
ctx.closePath();
startAngle = endAngle;
})
canvas的其他应用的更多相关文章
- html5 canvas常用api总结(三)--图像变换API
canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...
- 【探索】利用 canvas 实现数据压缩
前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
- 获取Canvas当前坐标系矩阵
前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...
- Canvas坐标系转换
默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...
- Canvas绘图之平移translate、旋转rotate、缩放scale
画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...
- 用html5的canvas和JavaScript创建一个绘图程序
本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...
- html5标签canvas函数drawImage使用方法
html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...
- 使用 JavaScript 和 canvas 做精确的像素碰撞检测
原文地址:Pixel accurate collision detection with Javascript and Canvas 译者:nzbin 我正在开发一个需要再次使用碰撞检测的游戏.我通常 ...
- H5项目开发分享——用Canvas合成文字
以前曾用Canvas合成.裁剪.图片等<用H5中的Canvas等技术制作海报>.这次用Canvas来画文字. 下图中"老王考到驾照后"这几个字是画在Canvas上的,与 ...
随机推荐
- java 日志的数据脱敏
思路 1.在 model层进行处理,直接重写get方法,在写一个getPlain 获取明文方法.(缺点:数据库写入和json序列化传递时使用的都是密文) 2.利用 日志组件过滤 特定的key,去进行脱 ...
- [LeetCode] 735. Asteroid Collision
行星碰撞. 题意是给一个数组 asteroids,表示在同一行的行星.对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动).每一颗行星以相同的速度移 ...
- 【代码学习】PHP面向对象之封装与继承
一.封装(访问控制) 就是将属性私有,并提供公有的setter放置与getter取值方法注:封装是进行访问控制,不是拒绝访问 public(公有) protected(受 ...
- 201771010135杨蓉庆《面向对象程序设计(java)》第六周学习总结
实验六 继承定义与使用 1.实验目的与要求 (1) 理解继承的定义: (2) 掌握子类的定义要求 (3) 掌握多态性的概念及用法: (4) 掌握抽象类的定义及用途: (5) 掌握类中4个成员访问权限修 ...
- 洛谷P1908 逆序对(线段树解法)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- ANSYS 瞬态热分析--样件加热
目录 1. 要求 2. ANSYS有限元分析 2.1 APDL建模 1. 要求 一块0.8m*0.4m*0.2m厚的钢板,在300℃的炉子中进行加热,其材料参数如下表所示: 材料参数 序号 名称 参数 ...
- Java 中序列化与反序列化引发的思考?
java 中序列化指从对象转变为 二进制流的过程中需要进行序列化,而反序列化指二进制流转换为java 对象.那么有的时候java 存储到数据库不需要序列化, 而计算机系统本质存储的就是二进制文件,数据 ...
- Python中利用for表达式创建列表
1.for表达式语法格式及用法 for表达式利用可迭代对象创建新的列表,for表达式也称为列表推导式,具体语法格式如下: [表达式 for 循环计数器 in 可迭代对象] 例: a = [ i + i ...
- Jquery 事件 文本框常用
1.只许输入类型 //只能输入整数和小数 function txtKeyUpDecimal(txtName) { getID(txtName).keyup(function(){ //keyup事件处 ...
- 【译】索引进阶(十七): SQL SERVER索引最佳实践
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章我们给出一些建议:贯穿本系列我们提取出了十四条基本指南,这些基本的指南将会帮助你为你的数据库创建最佳的索引 ...