我需要一种方法在mouseover
上显示图像的灰度版本。我已经看到这是使用浏览器的Canvas功能实现的,但不想使用该方法,因为在所有浏览器上实现canvas之前会有一段时间。
有没有人做过这样的事情?
答案 0 :(得分:3)
假设,正如reko_t所评论的那样,您不能仅仅出于某种原因在服务器上创建图像的灰度版本,在IE中可以使用专有的filter
CSS属性BasicImage with grayScale。你不需要JS来做这件事,它可以在CSS中声明:
a {
display: block;
width: 80px;
height: 15px;
background-image: url(http://www.boogdesign.com/images/buttons/microformat_hcard.png);
}
a:hover {
filter:progid:DXImageTransform.Microsoft.BasicImage(grayScale=1);
}
在Firefox中,您可以apply an SVG mask,或者您可以尝试使用canvas元素。
但是,最简单的解决方案可能是手动创建图像的灰度版本,或者使用GD等服务器端进行操作。
答案 1 :(得分:2)
在网上找到:
HTML 5引入了Canvas对象 可以用来绘制和操纵 图像
剧本:
function grayscale(image, bPlaceImage)
{
var myCanvas=document.createElement("canvas");
var myCanvasContext=myCanvas.getContext("2d");
var imgWidth=image.width;
var imgHeight=image.height;
// You'll get some string error if you fail to specify the dimensions
myCanvas.width= imgWidth;
myCanvas.height=imgHeight;
// alert(imgWidth);
myCanvasContext.drawImage(image,0,0);
// This function cannot be called if the image is not rom the same domain.
// You'll get security error if you do.
var imageData=myCanvasContext.getImageData(0,0, imgWidth, imgHeight);
// This loop gets every pixels on the image and
for (j=0; j<imageData.height; i++)
{
for (i=0; i<imageData.width; j++)
{
var index=(i*4)*imageData.width+(j*4);
var red=imageData.data[index];
var green=imageData.data[index+1];
var blue=imageData.data[index+2];
var alpha=imageData.data[index+3];
var average=(red+green+blue)/3;
imageData.data[index]=average;
imageData.data[index+1]=average;
imageData.data[index+2]=average;
imageData.data[index+3]=alpha;
}
}
if (bPlaceImage)
{
var myDiv=document.createElement("div");
myDiv.appendChild(myCanvas);
image.parentNode.appendChild(myCanvas);
}
return myCanvas.toDataURL();
}
用法:
<img id="myImage" src="image.gif"
onload="javascript:grayscale(this, true);"></img>
测试通过使用:
测试失败使用:
资源: http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html
答案 2 :(得分:2)
如果您不使用Canvas并且不想使用特定于浏览器的功能,则需要在服务器上生成灰度图像。无论是事先还是按需提供。该怎么做那是answered elsewhere on SO
答案 3 :(得分:0)
img {
mix-blend-mode: luminosity;
background: #000;
}