一.像素的概念
我们在电脑或者电视上能看到色彩斑斓的图像,其实这些图像都是由一个一个像素点构成的,那么就首先要知道什么
是像素以及什么是颜色。
在内存中,每个像素点由4字节构成,这4个字节的代表的含义如下:
(1)第一个字节决定像素的红色值
(2)第二个字节决定像素的绿色值
(3)第三个字节决定像素的蓝色值
(4)第四个字节决定像素的透明度值
上述每一个字节的取值是从0到255,比如(255,0,0,255),在内存中是用二进制表示,即它是一个32位的串:
11111111 00000000 00000000 11111111
0代表完全透明,255代表完全不透明。
那么为什么要用红绿蓝来表示呢?因为红绿蓝是三基色,自然界的大多数颜色都是通过它们的不同比例混合而成。
二.像素的设置
在HTML5至今都没有提供直接操作像素点的方法,但是我们也有办法,就是利用ImageData对象。
ImageData对象用来保存图像的像素值,它有3个重要的属性,分别是width,height,data。data属性是一
个连续的数组,实际上一张图像的所有像素值都保存在data数组里面的,例如:
ID.data[index*4 + 0]
ID.data[index*4 + 1]
ID.data[index*4 + 2]
ID.data[index*4 + 3]
上面取出了data数组中连续相邻的4个值,分别代表第index+1(因为数组从0开始)个像素的红色,绿色,蓝色和透明度值,这张图像中一共有width*height个像素,而data数组中共保存了4*width*height个值。
上下文Context有3个方法来创建,读取和设置ImageData对象,分别是:
createImageData(width,height); 在内存中创建一个指定大小的ImageData对象。
getImageData(x,y,width,height); 返回一个ImageData对象,包含了指定区域的像素数组。
putImageData(data,x,y); 把ImageData对象绘制到屏幕指定的区域上。
下面就以一个简单的例子来展示它们的用法(IE10支持)
image.html
<!DOCTYPE html>
<html>
<head>
<title>ImageData_example</title>
<head>
<body>
<canvas id="canvas" width="800" height="600" style="background-image:url(image.jpg)">
你的浏览器不支持canvas标签!
</canvas>
<br>
红色:<input type="range" min="1" max="100" οnchange="changeColor(event, 0)" /><br>
绿色:<input type="range" min="1" max="100" οnchange="changeColor(event, 1)" /><br>
蓝色:<input type="range" min="1" max="100" οnchange="changeColor(event, 2)" /><br>
透明:<input type="range" min="1" max="100" οnchange="changeColor(event, 3)" /><br>
<script src="image.js">
</script>
</body>
</html>
image.js
var canvas = document.getElementById('canvas');
var cxt = canvas.getContext('2d');
var width = parseInt(canvas.getAttribute('width'));
var height = parseInt(canvas.getAttribute('height'));
var image = new Image();
image.onload = imageLoaded;
image.src = "image.jpg";
//保存图像像素
var imageData = null;
function imageLoaded(){
//将图像滑到画布上
cxt.drawImage(image, 0, 0);
//取图像的像素数组
imageData = cxt.getImageData(0, 0, width, height);
}
function changeColor(event, offset){
imageLoaded();
for(var y = 0; y < imageData.height; y++){
for(var x = 0; x < imageData.width; x++){
var index = y * imageData.width + x;
//一个像素占4字节,p为当前指针的位置
var p = index * 4;
var color = imageData.data[p + offset] * event.target.value / 50;
color = Math.min(color, 255);
//将改变后的颜色存进数组
imageData.data[p + offset] = color;
}
}
//输出到屏幕
cxt.putImageData(imageData, 0, 0);
}
绘制随机像素点
rand-pixel.html
<!DOCTYPE html>
<html>
<head>
<title>ImageData_example</title>
<head>
<body>
<canvas id="canvas" width="500" height="400" style="background-color:black">
你的浏览器不支持canvas标签!
</canvas>
<br>
<input type="button" value="随机画点" οnclick="interval=setInterval(randomPixel, 1);" /><br>
<input type="button" value="停止" οnclick="clearInterval(interval);" /><br>
<input type="button" value="清除" οnclick="clearCanvas();" /><br>
<script src="rand-pixel.js">
</script>
</body>
</html>
rand-pixel.js
var canvas = document.getElementById('canvas');
var cxt = canvas.getContext('2d');
var width = parseInt(canvas.getAttribute('width'));
var height = parseInt(canvas.getAttribute('height'));
//保存图像像素
var imageData = cxt.createImageData(width, height);
function randomPixel(){
var x = parseInt(Math.random() * width);
var y = parseInt(Math.random() * width);
var index = y * width + x;
var p = 4 * index;
imageData.data[p + 0] = parseInt(Math.random() * 256);
imageData.data[p + 1] = parseInt(Math.random() * 256);
imageData.data[p + 2] = parseInt(Math.random() * 256);
imageData.data[p + 3] = parseInt(Math.random() * 256);
cxt.putImageData(imageData, 0, 0);
}
function clearCanvas(){
cxt.clearRect(0, 0, width, height);
imageData = cxt.createImageData(width, height);
}
标签:颜色,imageData,像素,width,var,height,data From: https://blog.51cto.com/u_16146153/6388070