以前在制做图片灰度渐变特效时都是经过事先准备好两张图片,一张彩色图片、一张灰色图片,而后经过CSS定位把灰色图片叠放到彩色图片上,鼠标移入时用jQury把灰色图像的透明度渐变为0,鼠标移出时再把灰色图片透明度渐变为1,这样就实现了图片的灰度渐变效果。但这种实现方式每张图片都要加载两张图片,影响网页打开的速度,若是图片是经过后台上传的话那就更麻烦了,每次都要上传两张图片,并且客户可不必定会使用图像处理软件把图片变为灰色哦。
这两天研究了图片灰度实现的问题,其实彻底能够利用CSS滤镜和HTML5的画布功能让彩色图片以灰度的方式呈如今浏览器上,以前的问题就迎难而解了。
如何实现图片灰度效果请阅读下面两篇文章
CSS实现图片灰度效果
CSS+Canvas实现图片灰度效果,兼容全部浏览器
html
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Gray</title> <style> .item { width: 200px; float: left; margin: 10px; text-align: center; } .ie { /*filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale = 1);*/ filter: Gray; } .box { width:200px; height:150px; position: relative; } .box img { position: absolute; top:0; left:0; } .img-color { z-index: 2; filter:alpha(opacity=0); opacity:0; } .img-gray { z-index: 1;} </style> <script src="jquery.js"></script> </head> <body> <div id="animate" class="box"><img id="img-color" class="img-color" src="chrysanthemum.jpg"/><img id="img-gray" class="img-gray" src="chrysanthemum.jpg"/></div> <script> 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(); } window.onload = function(){ var lteIE8 = !-[1,]; //IE8版本如下浏览器 var _imgColor = $('#img-color'), _imgGray = $('#img-gray'); //图片灰度效果 if(lteIE8){ _imgGray.addClass('ie'); }else{ _imgGray.attr('src', grayscale(_imgGray.attr('src'))); } //动画 _imgColor.hover( function(){ $(this).stop().animate({opacity:1}, 1000); }, function(){ $(this).stop().animate({opacity:0}, 1000); } ) } </script> </body> </html>
图片渐变的效果仍是同样经过jQury改变图片透明度的方式实现,不一样的是如今彩图和灰图用到的时同一张图片,浏览器不用额外加载多一张图。
注意:此次是彩色图片叠加在灰色图片上,经过改变彩色图片的透明度来实现渐变效果的,之因此这么作是由于在IE6下给图片使用灰度滤镜后会让外层的a标签连接失效。jquery