>  기사  >  웹 프론트엔드  >  HTML5 연습 - 회색 사진 갤러리 구현 방법

HTML5 연습 - 회색 사진 갤러리 구현 방법

黄舟
黄舟원래의
2017-03-23 16:06:221987검색

과거에는 웹에서 회색조 이미지를 표시하려면 이미지 소프트웨어를 사용하여 수동으로 변환해야 했습니다. 하지만 이제는 이미지 편집 소프트웨어 없이 html5캔버스를 사용하여 이 프로세스를 수행할 수 있습니다. 이 기능을 구현하는 방법을 보여주기 위해 html5와 jquery를 사용하여 데모를 만들었습니다.

목적

이 데모에서는 HTML5와 jquery를 사용하여 마우스가 이미지 밖으로 이동할 때 회색조 이미지와 원본 이미지 간의 전환을 구현하는 방법을 보여줍니다. .스위치. HTML5가 등장하기 전에는 이 기능을 구현하려면 회색조 이미지와 원본 이미지, 총 2개의 이미지를 준비해야 했습니다. 그러나 이제는 회색조 이미지가 원본 이미지에 직접 생성되기 때문에 HTML5의 도움으로 더 빠르고 쉽게 달성할 수 있습니다. 파일이나 이미지 표시 기능을 만들 때 이 js 코드가 도움이 되기를 바랍니다.

렌더링

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);        
        // 复制图片
        $(&#39;.item img&#39;).each(function(){            
        var el = $(this);
            el.css({"position":"absolute"}).wrap("<p class=&#39;img_wrapper&#39; 
            style=&#39;display: inline-block&#39;>").clone().addClass(&#39;img_grayscale&#39;)
            .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);
        });        
        // 使图片渐入 
        $(&#39;.item img&#39;).mouseover(function(){
            $(this).parent().find(&#39;img:first&#39;).stop().animate({opacity:1}, 1000);
        })
        $(&#39;.img_grayscale&#39;).mouseout(function(){
            $(this).stop().animate({opacity:0}, 1000);
        });        
    });    
    // 使用canvas制作灰色图片
    function grayscale(src){        
    var canvas = document.createElement(&#39;canvas&#39;);        
    var ctx = canvas.getContext(&#39;2d&#39;);        
    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 참조

위 코드 복사

타겟 이미지 설정(예: .post-img, img, .gallery img 등)

애니메이션 속도도 설정할 수 있습니다(예: 1000 = 1초)

호환성

크롬, 사파리, 파이어폭스 등 html5와 캔버스를 지원하는 모든 브라우저를 사용해봤습니다. HTML5를 지원하지 않는 브라우저의 경우 원본 이미지만 사용하고 그레이스케일 이미지는 생성하지 않습니다.

참고: 로컬 html 파일을 firefox 및 chrome에서 실행할 수 없는 경우 html 파일을 서버에 배포해야 합니다.

자기 연습

튜토리얼대로 직접 테스트해봤는데 주의할 점을 발견했습니다. 파이어폭스로 페이지를 열었는데 프로그램이 실행되지 않네요. 올바르게 실행되었지만 관련 코드가 서버에 도달한 후에 실행될 수 있습니다.

로컬 이미지여야 합니다. 그렇지 않으면 보안 오류가 보고됩니다.

이유는 다음과 같습니다.

캔버스는 HTML5 표준의 캔버스 요소이며 2D 및 3D 이미지를 그리는 데 사용할 수 있습니다.

그러나 다음과 같은 경우 보안이 발생하기 쉽습니다.

현재 디버깅 중에 발생한 보안 오류는 주로 toDataURL() 및 src에 나타납니다.

보안 오류는 이 코드에 의미상 문제가 없음을 의미합니다. . 하지만 보안상의 이유로 정상적으로 실행되지 않습니다.

보안 오류 발생:

  1. 캔버스에서 도메인 간 이미지 사용

  2. 로컬 서버리스 환경에서 디버깅

  3. 현재 도메인과 이미지 간의 관계를 얻을 수 없습니다

Stackoverflow에서 발견 일부 솔루션을 사용하면 일반적으로 도메인 간 문제를 해결할 수 있습니다.

그러나 실제로 로컬에서 디버깅할 때 서버 소프트웨어를 사용하지 않는 경우에도 이 문제가 발생합니다.

예: toDataURL 사용 기능을 로컬에서 디버깅할 때 현재 Canvas에서는 로컬 이미지 파일이 사용됩니다. Chrome 및 Firefox에서는 여전히 보안 오류가 발생합니다.

일반적인 해결 방법은 서버 환경을 로컬로 설정하거나 제출하는 것입니다. 콘텐츠를 다시 서버에서 디버깅합니다.

위 내용은 HTML5 연습 - 회색 사진 갤러리 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.