getImageData()和putImageData()方法进行图片像素操作。
获取图片像素数据。
var imgData = cxt.getImageData(x, y, width, height);
var data = imgData.data;
imagData,canvasPixelArray对象。
data,数组,[r1, g1, b1, a1, …]。
在canvas中显示图片。
cxt.putImageData(image, x, y);
getImageData()和putImageData()不受坐标系变换的影响。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
//cxt.save();
cxt.translate(50, 50);
cxt.fillStyle = "green"
cxt.fillRect(0, 0, 50, 200);
cxt.rotate(-30 * Math.PI / 180)
cxt.fillStyle = "blue"
cxt.fillRect(0, 0, 50, 200);
//cxt.restore
cxt.strokeStyle = "red"
cxt.strokeRect(50, 50, 50, 50);
var data = cxt.getImageData(50, 50, 50, 50);
cxt.putImageData(data, 200, 100);
}
</script>
</head>
<body>
<canvas id="canvas" width="400" height="300" style="border:1px dashed gray;"></canvas>
</body>
</html>
颜色反转,像素取相反值。
for(var i=0; i<data.length; i+=4) {
data[i+0] = 255-data[i+0];
data[i+1] = 255-data[i+1];
data[i+2] = 255-data[i+2];
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
data[i + 0] = 255 - data[i + 0];
data[i + 1] = 255 - data[i + 1];
data[i + 2] = 255 - data[i + 2];
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 60, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
data[i + 0] = 255 - data[i + 0];
data[i + 1] = 255 - data[i + 1];
data[i + 2] = 255 - data[i + 2];
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="250" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
灰度图(average),彩色图片转换成黑白图片。
for(var i=0; i<data.length; i+=4) {
var average = (data[i+0]+data[i+1]+data[i+2]) / 3;
data[i+0] = average;
data[i+1] = average;
data[i+2] = average;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
var average = (data[i+0]+data[i+1]+data[i+2]) / 3;
data[i+0] = average;
data[i+1] = average;
data[i+2] = average;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
var grayscale = data[i+0]*0.3+data[i+1]*0.6+data[i+2]*0.1;
data[i+0] = grayscale;
data[i+1] = grayscale;
data[i+2] = grayscale;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
图片变得更亮或更暗,加减值。
var a = -50;
for(var i=0; i<data.length; i+=4) {
data[i+0] += a;
data[i+1] += a;
data[i+2] += a;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
var a = 50;
data[i + 0] += a;
data[i + 1] += a;
data[i + 2] += a;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
sepia,古旧效果,加权平均。
for(var i=0; i<data.length; i+=4) {
var r = data[i+0];
var g = data[i+1];
var b = data[i+2];
data[i+0] = r*0.39+g*0.76+b*0.18;
data[i+1] = r*0.35+g*0.68+b*0.16;
data[i+2] = r*0.27+g*0.53+b*0.13;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
var r = data[i + 0];
var g = data[i + 1];
var b = data[i + 2];
data[i + 0] = r * 0.39 + g * 0.76 + b * 0.18;
data[i + 1] = r * 0.35 + g * 0.68 + b * 0.16;
data[i + 2] = r * 0.27 + g * 0.53 + b * 0.13;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
图片偏红的效果。r取rgb平均值,g,b取0。
for(var i=0; i<data.length; i+=4) {
var r = data[i+0];
var g = data[i+1];
var b = data[i+2];
var average = (r+g+b)/3;
data[i+0] = average;
data[i+1] = 0;
data[i+2] = 0;
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
var r = data[i + 0];
var g = data[i + 1];
var b = data[i + 2];
var average = (r + g + b) / 3;
data[i + 0] = average;
data[i + 1] = 0;
data[i + 2] = 0;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
透明度乘以n。
var n = 0.3;
for(var i=0; i<data.length; i+=4) {
data[i+3] *= n;
}
n取值范围0.0~1.0。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 10, 10);
var imgData = cxt.getImageData(10, 10, 120, 120);
var data = imgData.data;
//遍历每个像素
for (var i = 0; i < data.length; i += 4) {
data[i + 3] = data[i + 3] * 0.3;
}
//在指定位置输出图片
cxt.putImageData(imgData, 140, 10);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="300" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
创建区域进行像素操作。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var imgData = cxt.createImageData(100, 100);
var data = imgData.data;
for (var i = 0; i < 100 * 100 * 4; i += 4) {
data[i + 0] = 0;
data[i + 1] = 0;
data[i + 2] = 255;
data[i + 3] = 255;
}
cxt.putImageData(imgData, 20, 20);
}
</script>
</head>
<body>
<canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
<script type="text/javascript">
function $$(id) {
return document.getElementById(id);
}
window.onload = function () {
var cnv = $$("canvas");
var cxt = cnv.getContext("2d");
var image = new Image();
image.src = "images/princess.png";
image.onload = function () {
cxt.drawImage(image, 0, 0, 60, 60);
//获取一个图片的imgData
var imgData1 = cxt.getImageData(0, 0, 60, 60);
//利用这个图片的imgData作为参数
var imgData2 = cxt.createImageData(imgData1);
var data = imgData2.data;
for (var i = 0; i < imgData2.width * imgData2.height * 4; i += 4) {
data[i + 0] = 0;
data[i + 1] = 0;
data[i + 2] = 255;
data[i + 3] = 255;
}
cxt.putImageData(imgData2, 80, 0);
}
}
</script>
</head>
<body>
<canvas id="canvas" width="200" height="150" style="border:1px dashed gray;"></canvas>
</body>
</html>