2009-10-29 1 views
1

Мне нужен способ отображения черно-белой версии изображения на mouseover. Я видел, как это реализовано с использованием функции Canvas в браузере, но не хочу использовать этот метод, поскольку это будет некоторое время, прежде чем холст будет реализован во всех браузерах.Использование javascript для отображения серого варианта изображения при наведении на мышь

Кто-нибудь сделал такое?

+2

Вы имеете в виду без предварительного генерирования изображения с серой шкалой на стороне сервера в первую очередь? –

+0

Да. Это верно. –

ответ

2

Если вы не используете Canvas и не хотите использовать специфичные для браузера функции, вам понадобится генерировать ваши изображения в оттенках серого на сервере. Либо заранее, либо по требованию. Как это сделать answered elsewhere on SO

+3

Неправда, посмотрите эту библиотеку javascript: http://james.padolsey.com/demos/grayscale/ –

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> 

пройденных тестов Использование:

  • FireFox 3.5.4
  • Хром 3,0
  • Сафари 4.0

Тесты Failed Использование:

  • Internet Explorer 6
  • Интернет Explo RER 7

Ресурсы: http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html

+0

Вы также можете использовать excanvas для этого в IE. –

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, или вы можете попробовать использовать элемент холста.

Однако самым простым решением может быть либо вручную создать версии изображений в виде шкалы серого, либо сделать это на стороне сервера с чем-то вроде GD.

+0

Маски SVG требуют Firefox 3.5, поэтому вы, вероятно, захотите вернуться к решению на холсте, как то, что подарил Энтони М. Пауэрс. –

+0

Да, я тоже оглядывался, и я еще не нашел простой способ сделать маску с оттенками серого в SVG, поэтому, вероятно, лучше всего сделать полотно. – robertc

Смежные вопросы