首页 > 其他分享 >像素与颜色

像素与颜色

时间:2023-05-31 16:36:52浏览次数:27  
标签:颜色 imageData 像素 width var height data


一.像素的概念


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

是像素以及什么是颜色。


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

相关文章

  • react 滚动到指定位置上方100像素的位置
    /*使用方法:import{useRef}from'react';constanchor=useRef<HTMLDivElement>(null);<divref={anchor}>test</div><buttononClick={()=>{scrollWithAnimation(anchor.current?.offsetTop||0);}}>jump</b......
  • 颜色
    颜色题目描述给定一个长度为\(N\)的颜色序列\(C\),对于该序列中的任意一个元素,都有\(1\leqCi\leqM\)。对于一种颜色\(ColorK\)来说,区间\([L,R]\)内的权值定义为这种颜色在该区间中出现的次数的平方,即区间\([L,R]\)内中满足等于\(ColorK\)的元素个数的平方。接下......
  • vscode 自定义代码字体颜色,局部变量、全局变量、函数、宏、属性
    vscode自定义代码字体与颜色风格在setting.json中修改即可:在这里插入图片描述"editor.semanticTokenColorCustomizations":{       "enabled":true,//enableforallthemes       "rules":{           "*.static":{             ......
  • rgb颜色代码怎么透明
    在RGB颜色模式中,每个颜色通道的值范围是0到255。如果您想要使某种颜色透明,可以将该颜色的alpha通道值设置为0,其中alpha值表示颜色的不透明度,范围从0(完全透明)到1(完全不透明)。在CSS中,可以通过使用RGBA或者HSLA颜色来指定带有透明度的颜色。例如:color:rgba(255,......
  • php设置表单颜色
    代码:<!DOCTYPEhtml><html><head> <title>PHP设置表单颜色</title> <style> input[type=text],select{ padding:12px20px; margin:8px0; display:inline-block; border:1pxsolid#ccc; border-radius:4px; ......
  • Ubuntu20.04使终端用户名颜色高亮
    Ubuntu20.04使终端用户名颜色高亮问题背景你还在为你的Linux大量输出内容但是不能清晰的看到每次输入的命令而烦恼吗?找找下面图中的两条命令在哪......
  • cartographer代码——世界坐标系点和像素坐标系点的转换
    构建栅格地图,要弄清楚坐标之间的关系。本篇根据代码,画出了坐标转换的关系。如下图:cartographer中的代码如下://Returnstheindexofthecellcontainingthe'point'whichmaybeoutside//themap,i.e.,negativeortoolargeindicesthatwillreturnfalsefo......
  • 如何向顶点着色器传颜色?
    stringvs=@"#version330layout(location=og_positionVertexLocation)invec4position;uniformmat4og_modelViewPerspectiveMatrix;voidmain()......
  • FLEX实践—PieChart综合应用(颜色渐变、显示选中值、选中部分突出、数据钻探等)
    代码如下:(代码中附加了注释,每一种方法对应的效果均有注释)<?xmlversion="1.0"encoding="utf-8"?><mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Scr......
  • shell中设置文字输出的颜色及字体格式
    转载:(15条消息)shell中设置文字输出的颜色及字体格式_linux文字顏色_庚庚911的博客-CSDN博客ANSI控制码简介ANSI控制码用于在字符显示系统中控制光标移动和字符色彩等,常用于BBS系统中。ANSIESCAPESEQUENCES又称为VT100系列控制码,国内译为ANSI控制码。顾名思义,需要VT100系......