HTML5边玩边学(3)像素和颜色


Posted in HTML / CSS onSeptember 21, 2010

一、理解颜色

我们在电脑屏幕上可以看到色彩斑斓的图像,其实这些图像都是由一个个像素点组成的。那么像素是什么?颜色又是什么呢?(如果您提出这两个问题,您一定是个热爱思考的人)一个像素其实对应着内存中的一组连续的二进制位,由于是二进制位,每个位上的取值当然只能是 0 或者 1 了!这样,这组连续的二进制位就可以由 0 ,1 排列组合出很多种情况,而每一种排列组合就决定了这个像素的一种颜色。先看看下面这幅图

声明:为本文为原创文章,作者保留所有权利!欢迎转载,转载请注明作者左??/strong>和出处博客园

HTML5边玩边学(3)像素和颜色

 

我们可以看到这幅图描述了六个像素点,一共由24个小方框组成。

注意:图中的一个小方框代表一个字节,即8个二进制位。

因此,每个像素点由四个字节组成。图中也分别标出了这四个字节代表的含义:

第一个字节决定像素的红色值

第二个字节决定像素的绿色值

第三个字节决定像素的蓝色值

第四个字节决定像素的透明度值

每一种分颜色值的大小是从 0 到 255(提问:为什么只能到255?) ,透明度的取值:0 代表完全透明,255代表完全不透明

这样,我们就可以用(255,0,0,255)来表示一个纯红色像素

在内存中,他是这样的一个32位的串: 11111111 00000000 00000000 11111111

 

二、操作像素

了解了颜色和像素的实质,我们就可以对图形进行更加复杂的处理。

可是,HTML5 目前还没有提供类似 setPixel 或者 getPixel 这样直接操作像素点的方法, 但是我们也有办法

就是使用 ImageData 对象:

ImageData对象用来保存图像像素值,它有 width、height和 data 三个属性,其中 data 属性就是一个连续数组,图像的所有像素值其实是保存在 data 里面的。

data 属性保存像素值的方法和我们在前面图片中看到的一模一样:

imageData.data[index*4 +0]

imageData.data[index*4 +1]

imageData.data[index*4 +2]

imageData.data[index*4 +3]

上面取出了 data 数组中连续相邻的四个值,这四个值分别代表了图像中第 index+1 个像素的红色、绿色、蓝色和透明度值的大小。

注意index 从0 开始,图像中总共有 width * height 个像素,数组中总共保存了 width * height * 4 个数值

 

上下文对象 Context 有三个方法用来创建、读取和设置 ImageData 对象,他们分别是

createImageData(width, height):在内存中创建一个指定大小的 ImageData 对象(即像素数组),对象中的像素点都是黑色透明的,即rgba(0,0,0,0)

getImageData(x, y, width, height):返回一个 ImageData 对象,这个 IamgeData 对象中包含了指定区域的像素数组

putImageData(data, x, y):将 ImageData 对象绘制到屏幕的指定区域上

 

三、一个简单的图像处理例子

上面说了这么多,我们用了解的知识来玩玩图像编程,或许有一天我们就要在 Chrome 中玩 PhotoShop 了。

程序大概是这个样子的:

1、将一幅图片绘制到一个 canvas 元素上,为了不引发安全错误(Security_ERR:DOM EXCEPTION 18),我用的是我博客顶部的横幅背景图片。你要运行这个例子,可能需要改成自己的图片

2、有四个滑动条,分别代表 GRBA 四个分量

3、拖动滑动条,图像中对应的颜色分量就会增加或者减少

4、如果图像变成透明,就会显示 canvas 元素的背景,我把这个背景设置成了我的头像,呵呵。

思路:其实就是用 getImageData 方法,将你想改变的那一块区域的像素数组取出来,然后根据你拖动的滑动条和滑动条的数值,来更改那一块区域里所有像素对应颜色分量的值。处理完毕后再用 putImageData 方法绘制到画布上,就是这么简单。

下面是代码:

简单的图像处理

复制代码
代码如下:

<canvas id="test1" width="507" height="348" style="background-image:url(http://images.cnblogs.com/cnblogs_com/myqiao/262115/r_2204793492575248335.jpg)">你的浏览器不支持 <canvas>标签,请使用 Chrome 浏览器 或者 FireFox 浏览器</canvas>
红色:<input type="range" min="1" max="100" onchange="colorChange(event,0)"/>
绿色:<input type="range" min="1" max="100" onchange="colorChange(event,1)"/>
蓝色:<input type="range" min="1" max="100" onchange="colorChange(event,2)"/>
透明:<input type="range" min="1" max="100" onchange="colorChange(event,3)"/>
<script type="text/javascript">
//获取上下文对象
var canvas = document.getElementById("test1");
var ctx = canvas.getContext("2d");
//画布的宽度和长度
var width = parseInt(canvas.getAttribute("width"));
var height = parseInt(canvas.getAttribute("height"));
//装入图像
var image = new Image();
image.onload =imageLoaded;
//顶部背景图片
image.src = "/skins/Valentine/images/banner2.gif";
//用来保存像素数组的变量
var imageData=null;
function imageLoaded() {
// 将图片画到画布上
ctx.drawImage(image, 0, 0);
//取图像的像素数组
imageData = ctx.getImageData(0, 0, width, height);
}
function colorChange(event,offset){
imageLoaded();
for (var y = 0; y < imageData.height; y++) {
for (x = 0;x < imageData.width; x++) {
//index 为当前要处理的像素编号
var index = y * imageData.width + x;
//一个像素占四个字节,即 p 为当前指针的位置
var p = index * 4;
//改变当前像素 offset 颜色分量的数值,offset 取值为0-3
var color = imageData.data[p + offset] * event.target.value / 50;
// 颜色值限定在[0..255]
color = Math.min(255, color);
//将改变后的颜色值存回数组
imageData.data[p + offset]=color
}
}
//输出到屏幕
ctx.putImageData(imageData, 0, 0);
}
</script>

演示效果:

提示:您可以先修改部分代码再运行
 

四、绘制随机颜色的点

这个例子是在画布上随机选择一个点,然后再给他一个随机的颜色值,其实用到的方法和上面的例子大同小异,就是需求不同罢了。

下面是代码和程序实例:
随机颜色的点

复制代码
代码如下:

<canvas id="test2" width="300" height="300" style=" background-color: black">你的浏览器不支持 <canvas>标签,请使用 Chrome 浏览器 或者 FireFox 浏览器</canvas>
<input type="button" value="画随机点" onclick="interval=setInterval(randomPixel,1);" />
<input type="button" value="停止" onclick="clearInterval(interval);"/>
<input type="button" value="清除" onclick="clearCanvas();"/>
<script type="text/javascript">
//获取上下文对象
var canvas = document.getElementById("test2");
var ctx = canvas.getContext("2d");
//画布的宽度和长度
var width = parseInt(canvas.getAttribute("width"));
var height = parseInt(canvas.getAttribute("height"));
var imageData = ctx.createImageData(width, height);
function randomPixel(){
var x= parseInt(Math.random()*width);
var y= parseInt(Math.random()*height);
var index = y * width + x;
var p = index * 4;
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);
ctx.putImageData(imageData,0,0);
}
function clearCanvas(){
ctx.clearRect(0,0,width,height);
imageData = ctx.createImageData(width, height);
}
</script>

演示效果:

提示:您可以先修改部分代码再运行
HTML / CSS 相关文章推荐
css3 实现元素弧线运动的示例代码
Apr 24 HTML / CSS
css3遮罩层镂空效果的多种实现方法
May 11 HTML / CSS
HTML5实现表单自动验证功能实例代码
Jan 11 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
Feb 01 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
Jan 26 HTML / CSS
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
Jan 31 HTML / CSS
HTML5视频支持检测(检查浏览器是否支持视频播放)
Jun 08 HTML / CSS
借助HTML5 Canvas API制作一个简单的猜字游戏
Mar 25 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
Nov 14 HTML / CSS
详解android与HTML混合开发总结
Jun 06 HTML / CSS
canvas拼图功能实现代码示例
Nov 21 HTML / CSS
Html5跳转到APP指定页面的实现
Jan 14 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
Sep 21 #HTML / CSS
HTML5边玩边学(1)画布实现方法
Sep 21 #HTML / CSS
html5 学习简单的拾色器
Sep 03 #HTML / CSS
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
Jul 20 #HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
Jun 11 #HTML / CSS
用HTML5.0制作网页的教程
May 30 #HTML / CSS
HTML5 微格式和相关的属性名称
Feb 10 #HTML / CSS
You might like
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Python的形参和实参使用方式
2019/12/24 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
电气个人求职信范文
2014/02/04 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
投标担保书范文
2014/04/02 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
成都人事代理协议书
2014/10/25 职场文书
优秀团员个人总结
2015/02/26 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
活动简报范文
2015/07/22 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python