HTML5实践-图片设置成灰度图


Posted in HTML / CSS onNovember 12, 2012

以前,在web上要显示灰度图片的话,只有手工使用图片软件转换。但是现在借助于html5的canvas可以实现这个过程,而不需要再借助图片编辑软件了。我用html5和jquery做了一个demo,来展示如何实现这个功能。

目的
这个demo将会向你展示用html5和jquery,如何实现鼠标在图片上移动移出时,灰度图像和原图之间的切换。在html5出现之前,要实现这个功能就需要准备两个图片,一个灰度图片,一个原图。但是现在借助于html5可以实现的更快更容易,因为灰度图片是直接在原图上生成的。我希望这段js代码对你在创建文件或者图片陈列功能的时候有帮助作用。

效果图
HTML5实践-图片设置成灰度图 
jquery 代码
下面的jquery代码将会寻找目标图片,并生成一个灰度的版本。当你鼠标移动到图片上时,灰度图片会变成原色。

复制代码
代码如下:

<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
// 设置 window load事件是为了等待所有图片加载完毕之后才行运行
$(window).load(function(){
// 使图片渐入,这样有颜色的原图就不会显示出来了,然后再执行window load 事件
$(".item img").fadeIn(500);
// 复制图片
$('.item img').each(function(){
var el = $(this);
el.css({"position":"absolute"}).wrap("<div class='img_wrapper' style='display: inline-block'>").clone().addClass('img_grayscale').css({"position":"absolute","z-index":"998","opacity":"0"}).insertBefore(el).queue(function(){
var el = $(this);
el.parent().css({"width":this.width,"height":this.height});
el.dequeue();
});
this.src = grayscale(this.src);
});
// 使图片渐入
$('.item img').mouseover(function(){
$(this).parent().find('img:first').stop().animate({opacity:1}, 1000);
})
$('.img_grayscale').mouseout(function(){
$(this).stop().animate({opacity:0}, 1000);
});
});
// 使用canvas制作灰色图片
function grayscale(src){
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var imgObj = new Image();
imgObj.src = src;
canvas.width = imgObj.width;
canvas.height = imgObj.height;
ctx.drawImage(imgObj, 0, 0);
var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
for(var y = 0; y < imgPixels.height; y++){
for(var x = 0; x < imgPixels.width; x++){
var i = (y * 4) * imgPixels.width + x * 4;
var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
imgPixels.data[i] = avg;
imgPixels.data[i + 1] = avg;
imgPixels.data[i + 2] = avg;
}
}
ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
return canvas.toDataURL();
}
</script>

如何使用
依照下面的步骤:
引用jquery.js
复制上面的代码
设置目标图片(eg: .post-img, img, .gallery img, etc.)
你也可以设置动画的速度(ie. 1000 = 1 second)
HTML5实践-图片设置成灰度图 
兼容性
我尝试了所有支持html5和canvas的浏览器,例如:Chrome, Safari, 和 Firefox。如果是不支持html5的浏览器,他只会用原图,不会生成灰度图片。
注意:如果本地html文件不能在firefox和chrome上运行的话,你就需要将html文件部署到服务器上去了。

自我实践
我自己按照教程测试了下,发现些需要注意的事项,使用firefox打开页面,程序不能正确运行,但是将相关代码部署到服务器之后可以运行。
必须保证是本地图片,不然要报Security error。
这是因为
Canvas是HTML5标准中的画布元素,可以用来绘制2D和3D图像.
但是在调试的时候很容易遇到Security error问题.
目前我在调试时遇到过的Security error主要是出现在toDataURL()和src上.
Security error说明这段代码没有语义问题,但因为安全原因无法正常运行.

throw Security error的情况:
在Canvas中使用跨域图片
在本地无服务器环境下进行调试
无法获取当前域与图片的关系
在stackoverflow上查到的一些解决方法通常是让你解决跨域问题.
但实际上如果你本地调试时不使用服务器软件也会造成这个问题.
例如: 本地调试时使用toDataURL功能,此时的Canvas中使用了本地的图片文件.在Chrome和Firefox中仍然会throw security error.
常见的解决方法是在本地架设一个服务器环境,或者将内容提交到服务器上再进行调试.

HTML / CSS 相关文章推荐
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
Jan 06 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
Jul 08 HTML / CSS
纯html5+css3下拉导航菜单实现代码
Mar 18 HTML / CSS
HTML5 离线应用之打造零请求、无流量网站的解决方法
Apr 25 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
Jun 09 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
Jul 19 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
Sep 02 HTML / CSS
HTML5的postMessage的使用手册
Dec 19 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
Jun 23 HTML / CSS
CSS预处理框架——Stylus
Apr 21 HTML / CSS
通过feDisplacementMap和feImage实现水波特效
Apr 24 HTML / CSS
CSS 鼠标选中文字后改变背景色的实现代码
May 21 HTML / CSS
使用css如何制作时间ICON方法实践
Nov 12 #HTML / CSS
浅谈three.js中的needsUpdate的应用
Nov 12 #HTML / CSS
HTML5教程之html 5 本地数据库(Web Sql Database)
Apr 03 #HTML / CSS
用HTML5实现手机摇一摇的功能的教程
Oct 30 #HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
Oct 26 #HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
Oct 20 #HTML / CSS
HTML5上传文件显示进度的实现代码
Aug 30 #HTML / CSS
You might like
用PHP函数解决SQL injection
2006/10/09 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
Symfony核心类概述
2016/03/17 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
解决vue移动端适配问题
2018/12/12 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
Python+django实现文件上传
2016/01/17 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
浅析Python迭代器的高级用法
2020/07/16 Python
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
广告学专业自荐信范文
2014/02/24 职场文书
明信片寄语大全
2014/04/08 职场文书
产品设计开发计划书
2014/05/07 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
七一建党节演讲稿
2014/09/11 职场文书
银行先进个人总结
2015/02/15 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
详解jQuery的核心函数和事件处理
2022/02/18 jQuery