HTML5第3天
一、html5
1.1 绘制图片
drawImage 该方法用于绘制图片,使用方式有三种:
? 第一种使用方式:可以以原尺寸来绘制图片
? ctx.drawImage(img, x, y)
? img: 要绘制的图片
? x: 以原尺寸将图片放在canvas中的x点
? y: 以原尺寸将图片放在canvas中的y点
? 第二种使用方式: 可以缩放图片
? ctx.drawImage(img, x, y, w, h)
? img: 要绘制的图片
? x: 将缩放后的图片放在canvas中的x点
? y:将缩放后的图片放在canvas中的y点
? w: 缩放后的图片的宽 h: 缩放后的图片的高
? 第三种方式: 截取图片中的某一部分
? ctx.drawImage(img, img_x, img_y, img_w, img_h, canvas_x, canvas_y, canvas_w, canvas_h)
? img: 要绘制的图片
? img_x: 要截取的图片的x点 i
? mg_y: 要截取的图片的y点
? img_w: 要截取的图片的宽
? img_h: 要截取的图片的高
? canvas_x: 将截取后的图片放在canvas中的x点
? canvas_y: 将截取后的图片放在canvas中的y点
? canvas_w: 将截取后的图片放在canvas中的宽
? canvas_h: 将截取后的图片放在canvas中的高
<!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>Document</title>
<style>
canvas {
border: 1px solid #000;
}
</style>
</head>
<body>
<canvas width="1600" height="844" id="myCanvas"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var img = new Image();
img.src = './images/sf.jpg';
img.onload = function() {
ctx.drawImage(img, 240, 75, 450, 750, 0, 0, 275, 375);
}
</script>
</body>
</html>
1.2 坐标系变换
canvas中允许我们对坐标系做变换,类似css中的transorm
? translate(x, y) 移动坐标系
? x 表示水平移动
? y 表示垂直方向移动
? rotate(deg) 渲染坐标系
? deg 表示旋转角度 单位是弧度(PI)
? scale(x, y) 缩放坐标系
? x 表示水平方向缩放
? y 表示垂直方向缩放
大于1表示放大,小于1表示缩小。
<!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>Document</title>
<style>
canvas {
display: block;
margin: 0 auto;
border: 1px solid #000;
}
</style>
</head>
<body>
<canvas id="myCanvas" width="800" height="600"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
function drawXy() {
function line(x, y, endX, endY) {
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(endX, endY);
ctx.stroke();
}
line(5, 5, 785, 5);
line(780, 0, 785, 5);
line(780, 10, 785, 5);
line(5, 5, 5, 585);
line(0, 580, 5, 585);
line(10, 580, 5, 585);
}
drawXy();
ctx.translate(canvas.width / 2, canvas.height / 2);
ctx.scale(0.5, 0.5);
drawXy();
</script>
</body>
</html>
1.3 状态的存储与恢复
在canvas中很多时候要用到之前的状态,所以提供了相应的API用于保存cnavas上的状态
? save 存储状态
? restore 恢复状态
save方法可以使用多次,每save一次就好比装了一颗子弹
每restore一次,就好比扣了一次扳机
<!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>Document</title>
<style>
canvas {
display: block;
margin: 0 auto;
border: 1px solid #000;
}
</style>
</head>
<body>
<!-- H5中提供了标签 canvas 用于提供画布 -->
<canvas width="800" height="500" id="myCanvas"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'orange';
ctx.fillRect(0, 0, 100, 100);
ctx.save();
ctx.fillStyle = 'skyblue';
ctx.fillRect(100, 100, 100, 100);
ctx.save();
ctx.restore();
ctx.restore();
ctx.fillRect(200, 200, 100, 100);
</script>
</body>
</html>
1.4 像素信息
getImageData 该方法用于获取canvas上的像素信息 返回的是一个像素信息对象,该对象中有三个属性 第一个 是一个data是一个数组 第二个 是height 表示获取图像的高度 第三个 是width表示获取图像的宽度 putImageData 该方法用于将修正之后的像素信息对象重新放回canvas,三个参数分别是: 第一个参数:像素数据 第二个参数:绘制横坐标 第三个参数:绘制纵坐标
<!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>Document</title>
<style>
canvas {
display: block;
margin: 0 auto;
border: 1px solid #000;
}
body {
text-align: center;
}
</style>
</head>
<body>
<!-- H5中提供了标签 canvas 用于提供画布 -->
<canvas width="800" height="422" id="myCanvas"></canvas>
<button id="getPX">获取像素</button>
<button id="red">去掉红色</button>
<button id="green">去掉绿色</button>
<button id="blue">去掉蓝色</button>
<button id="gray">灰度</button>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
var getPX = document.getElementById('getPX');
var red = document.getElementById('red');
var green = document.getElementById('green');
var blue = document.getElementById('blue');
var gray = document.getElementById('gray');
var img = new Image();
img.src = './images/sf.jpg';
img.onload = function() {
ctx.drawImage(this, 0, 0, 800, 422);
}
getPX.onclick = function() {
var imgData = ctx.getImageData(0, 0, 800, 422);
}
red.onclick = function() {
var imgData = ctx.getImageData(0, 0, 800, 422);
for (var i = 0; i < imgData.data.length; i += 4) {
imgData.data[i] = 0;
}
ctx.putImageData(imgData, 0, 0);
}
green.onclick = function() {
var imgData = ctx.getImageData(0, 0, 800, 422);
for (var i = 1; i < imgData.data.length; i += 4) {
imgData.data[i] = 0;
}
ctx.putImageData(imgData, 0, 0);
}
blue.onclick = function() {
var imgData = ctx.getImageData(0, 0, 800, 422);
for (var i = 2; i < imgData.data.length; i += 4) {
imgData.data[i] = 0;
}
ctx.putImageData(imgData, 0, 0);
}
gray.onclick = function() {
var imgData = ctx.getImageData(0, 0, 800, 422);
for (var i = 0; i < imgData.data.length; i += 4) {
var r = imgData.data[i];
var g = imgData.data[i + 1];
var b = imgData.data[i + 2];
var avg = (r + g + b) / 3;
imgData.data[i] = avg;
imgData.data[i + 1] = avg;
imgData.data[i + 2] = avg;
}
ctx.putImageData(imgData, 0, 0);
}
</script>
</body>
</html>
1.5 融合
所谓的融合,就是在canvas中新图形和原有图形之间的覆盖方式。 默认情况下,新图形覆盖原有图片 通过ctx.globalCompositeOperation属性设置 source-over 默认。在目标图像上显示源图像。 source-top 在目标图像顶部显示源图像。源图像位于目标图像之外的部分是不可见的。 source-in 在目标图像中显示源图像。只有目标图像内的源图像部分会显示,目标图像是透明的。 source-out 在目标图像之外显示源图像。只会显示目标图像之外源图像部分,目标图像是透明的。
? destination-over 在源图像上方显示目标图像。 ? destination-atop 在源图像顶部显示目标图像。源图像之外的目标图像部分不会被显示。 ? destination-in 在源图像中显示目标图像。只有源图像内的目标图像部分会被显示,源图像是透明的。 ? destination-out 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。 ? lighter 显示源图像 + 目标图像。 ? copy 显示源图像。忽略目标图像。 ? xor 使用异或操作对源图像与目标图像进行组合。
<!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>Document</title>
<style>
canvas {
display: block;
margin: 0 auto;
border: 1px solid #000;
}
</style>
</head>
<body>
<!-- 定义画布 -->
<canvas id="myCanvas" width="800" height="600"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
function drawRect(color, x, y, w, h) {
ctx.fillStyle = color;
ctx.fillRect(x, y, w, h);
}
drawRect('skyblue', 0, 0, 150, 150);
ctx.globalCompositeOperation = 'source-in';
drawRect('orange', 300, 300, 150, 150);
</script>
</body>
</html>
|