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让div随鼠标移动而抖动起来
Feb 10 HTML / CSS
使用CSS3来实现滚动视差效果的教程
Aug 24 HTML / CSS
html5 web本地存储将取代我们的cookie
Dec 26 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
Jan 06 HTML / CSS
html5教程画矩形代码分享
Dec 04 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
Dec 30 HTML / CSS
分享29个基于Bootstrap的HTML5响应式网页设计模板
Nov 19 HTML / CSS
用HTML5的canvas实现一个炫酷时钟效果
May 20 HTML / CSS
HTML5制作表格样式
Nov 15 HTML / CSS
html5 div布局与table布局详解
Nov 16 HTML / CSS
HTML5自定义属性的问题分析
Aug 16 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递归返回值时出现的问题解决办法
2013/02/19 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
php实现求相对时间函数
2015/06/15 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
php实现登陆模块功能示例
2016/10/20 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
python将list转为matrix的方法
2018/12/12 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
Python连接mysql方法及常用参数
2020/09/01 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
小学英语教学反思
2014/01/30 职场文书
医疗纠纷协议书
2014/04/16 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
党员一帮一活动总结
2014/07/08 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
全新239军机修复记
2022/04/05 无线电