像素与色彩

像素与颜色

一.像素的概念


我们在电脑或者电视上能看到色彩斑斓的图像,其实这些图像都是由一个一个像素点构成的,那么就首先要知道什么

像素以及什么是颜色。


在内存中,每个像素点由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支持)

<!DOCTYPE html>
<html>
     <head>
	      <title>ImageData_example</title>
	 <head>
	 <body>
          <canvas id="canvas" width="500" height="400" style="background-image:url(1.jpg)">
		       你的浏览器不支持canvas标签!
		  </canvas>
          <br>
		  红色:<input type="range" min="1" max="100" onchange="changeColor(event,0)" /><br>
		  绿色:<input type="range" min="1" max="100" onchange="changeColor(event,1)" /><br>
		  蓝色:<input type="range" min="1" max="100" onchange="changeColor(event,2)" /><br>
		  透明:<input type="range" min="1" max="100" onchange="changeColor(event,3)" /><br>
          
		  <script>
               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 = "2.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);
			   }
		  </script>
	 </body>
</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="随机画点" onclick="interval=setInterval(randomPixel,1);" /><br>
		  <input type="button" value="停止" onclick="clearInterval(interval);" /><br>
		  <input type="button" value="清除" onclick="clearCanvas();" /><br>
          
		  <script>
               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);
			   }
		  </script>
	 </body>
</html>