2009-10-29 3 views
1

mouseover에 이미지의 회색조 버전을 표시하는 방법이 필요합니다. 이 기능은 브라우저의 캔버스 기능을 사용하여 구현되었지만 모든 브라우저에서 캔버스가 구현되기 전에는 그 방법을 사용하지 않으려 고합니다.자바 스크립트를 사용하여 마우스 오버시 이미지의 회색조 버전 표시

그런 일을 한 사람이 있습니까? 인터넷에서 찾을 수

+2

먼저 서버 측에서 회색조 이미지를 사전 생성하지 않고 사용 하시겠습니까? –

+0

예. 그게 맞아. –

답변

2

Canvas를 사용하지 않고 브라우저 별 기능을 사용하지 않으려면 서버에서 그레이 스케일 이미지를 생성해야합니다. 사전 또는 필요시. 수행 방법 예 : answered elsewhere on SO

+3

사실이 아닙니다.이 자바 스크립트 라이브러리를 확인하십시오. http://james.padolsey.com/demos/grayscale/ –

2

:

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(); 
    } 

사용법 :

HTML 5는 이 스크립트를 그리고 이미지

를 조작하는 데 사용할 수있는 캔버스 객체를 소개합니다 :

<img id="myImage" src="image.gif" 
    onload="javascript:grayscale(this, true);"></img> 

테스트하여 통과 :

  • 파이어 폭스 3.5.4
  • 크롬 3.0
  • 사파리 4.0

테스트 사용 실패 :

  • 인터넷 익스플로러 6
  • 인터넷 Explo RER 7

자료 : reko_t이 주석 것처럼, 당신은 단지 몇 가지 이유로 서버에있는 이미지의 그레이 스케일 버전을 만들 수 없습니다, 가정 http://www.permadi.com/tutorial/jsCanvasGrayscale/index.html

+0

excanvas를 사용하여 IE에서도이 작업을 수행 할 수 있습니다. –

3

, 그것은 IE에서 가능은 독점 filter을 사용하여 CSS 속성, BasicImage with grayScale. , 당신은 apply an SVG mask 수 파이어 폭스에서

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); 
} 

을하거나 캔버스 요소를 사용하여 시도 할 수 있습니다 : 당신은이 CSS 선언 할 수있다, 이렇게 JS 필요하지 않습니다.

그러나 가장 간단한 해결책은 이미지의 회색조 버전을 수동으로 만들거나 GD과 같은 것으로 서버 쪽에서 만들 수 있습니다.

+0

SVG 마스크에는 Firefox 3.5가 필요하므로 Anthony M. Powers가 제출 한 것과 같은 캔버스 솔루션으로 돌아가고 싶을 것입니다. –

+0

그래, 나도 주변을 둘러 보았고 아직 SVG에서 '그레이 스케일 마스크'를 사용하는 쉬운 방법을 찾지 못했기 때문에 항상 캔버스를 사용하는 것이 좋습니다. – robertc