HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?

不言
풀어 주다: 2018-12-03 10:42:05
원래의
5610명이 탐색했습니다.

모자이크 이미지를 표시할 때 페이드인 애니메이션은 매우 흐릿한 모자이크에서 매우 선명한 모자이크로 점차 바뀌는 과정입니다. 페이드아웃 애니메이션의 처리는 이미지가 선명해졌다가 점차 흐려지는 과정입니다. 구체적인 내용을 살펴보세요.

HTML5 canvas

먼저 모자이크 이미지의 페이드인 효과를 살펴보겠습니다

코드는 다음과 같습니다

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <meta charset="utf-8" />
  <script type="text/javascript">
    var imageData;
    var fadeMosaicSize = 0;
    var THandle;
    var mem_canvas;
    var mem_context;
    var context;
    var img;
    function loadImage() {
      img = new Image();
      mem_canvas = document.createElement(&#39;canvas&#39;);
      img.onload = function onImageLoad() {
        mem_canvas.width = img.width;
        mem_canvas.height = img.height;
        mem_context = mem_canvas.getContext(&#39;2d&#39;);
        mem_context.drawImage(img, 0, 0);
        imageData = mem_context.getImageData(0, 0, mem_canvas.width, mem_canvas.height);
        startFadeIn();
      }
      img.src = &#39;img/luffy.jpg&#39;;
      var canvas = document.getElementById(&#39;SimpleCanvas&#39;);
      if (!canvas || !canvas.getContext) {
        return false;
      }else{
        context = canvas.getContext(&#39;2d&#39;);
      }
    }
    function startFadeIn() {
      fadeMosaicSize = 64;
      THandle = setInterval(onFadeIn, 50);
    }
    function onFadeIn() {
      if (fadeMosaicSize <= 1) {
        clearInterval(THandle);
        context.drawImage(img, 32, 32);
      } else {
        CreateMosaic(mem_context, mem_canvas.width, mem_canvas.height, fadeMosaicSize);
        context.drawImage(mem_canvas, 32, 32);
        fadeMosaicSize = Math.floor(fadeMosaicSize / 1.5);
      }
    }
    function CreateMosaic(context, width,height,mosaicSize) {
      var x=0;
      var y=0;
      for (y = 0; y < height; y = y + mosaicSize) {
        for (x = 0; x < width; x = x + mosaicSize) {
          var cR = imageData.data[(y * width + x) * 4];
          var cG = imageData.data[(y * width + x) * 4 + 1];
          var cB = imageData.data[(y * width + x) * 4 + 2];
          context.fillStyle = "rgb("+cR+","+cG+","+cB+")";
          context.fillRect(x, y, x + mosaicSize, y + mosaicSize);
        }
      }
    }
  </script>
</head>
<body onload="loadImage();" style="background-color:#D0D0D0;">
  <canvas id="SimpleCanvas" width="640" height="360" style="background-color:#FFFFFF;"></canvas>
  <div>Canvas Demo</div>
  <div id="output"></div>
</body>
</html>
로그인 후 복사

설명:

body 태그의 onload 이벤트로 인해 loadImagen() 함수는 페이지가 표시될 때 호출됩니다.

페이지가 표시된 후 내부적으로 그려진 Canves 개체를 만들고 이미지를 읽습니다. 그려진 픽셀 데이터를 가져옵니다. 그 후 타이머 처리를 시작하고 타이머 이벤트에 모자이크 이미지를 생성하여 화면에 그립니다. 타이머 처리를 실행하면 모자이크 크기(fadeMosaicSize)가 페이드인 효과를 표현하기 위해 매우 두꺼운 모자이크에서 시작하여 매우 선명한 모자이크 애니메이션으로 줄어들게 됩니다.

그라디언트 속도를 조정하려면 타이머 간격을 변경할 수 있습니다.

fadeMosaicSize = Math.floor(fadeMosaicSize / 1.5);
로그인 후 복사

결과 실행:

위의 HTML 파일을 표시합니다. 깊은 모자이크 이미지를 표시합니다.

HTML5 canvas

이것은 역동적인 과정으로, 이미지가 서서히 선명해지고 마침내 다음과 같은 효과가 나타납니다.

HTML5 canvas

페이드인 효과를 본 후 페이드인 구현을 살펴보겠습니다. 그리고 모자이크 이미지의 페이드 아웃 효과

코드는 다음과 같습니다

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <meta charset="utf-8" />
  <script type="text/javascript">
    var imageData;
    var fadeMosaicSize = 0;
    var THandle;
    var mem_canvas;
    var mem_context;
    var context;
    var img;
    function loadImage() {
      img = new Image();
      mem_canvas = document.createElement(&#39;canvas&#39;);

      img.onload = function onImageLoad() {
        mem_canvas.width = img.width;
        mem_canvas.height = img.height;
        mem_context = mem_canvas.getContext(&#39;2d&#39;);
        mem_context.drawImage(img, 0, 0);
        imageData = mem_context.getImageData(0, 0, mem_canvas.width, mem_canvas.height);
        startFadeIn();
      }
      img.src = &#39;img/luffy.jpg&#39;;
      var canvas = document.getElementById(&#39;SimpleCanvas&#39;);
      if (!canvas || !canvas.getContext) {
        return false;
      }else{
        context = canvas.getContext(&#39;2d&#39;);
      }
    }
    function startFadeIn() {
      fadeMosaicSize = 64;
      THandle = setInterval(onFadeIn, 50);
    }
    function startFadeOut() {
      fadeMosaicSize = 1;
      THandle = setInterval(onFadeOut, 50);
    }
    function onFadeIn() {
      if (fadeMosaicSize <= 1) {
        clearInterval(THandle);
        context.drawImage(img, 32, 32);
        THandle = setInterval(onShow, 2000);
      } else {
        CreateMosaic(mem_context, mem_canvas.width, mem_canvas.height, fadeMosaicSize);
        context.drawImage(mem_canvas, 32, 32);
        fadeMosaicSize = Math.floor(fadeMosaicSize / 1.5);
      }
    }
    function onShow() {
      clearInterval(THandle);
      startFadeOut();
    }
    function onFadeOut() {
      if (64 < fadeMosaicSize) {
        clearInterval(THandle);

        context.fillStyle = "#FFFFFF";
        context.fillRect(32, 32, mem_canvas.width, mem_canvas.height);
      } else {
        CreateMosaic(mem_context, mem_canvas.width, mem_canvas.height, fadeMosaicSize);
        context.drawImage(mem_canvas, 32, 32);
        fadeMosaicSize = Math.ceil(fadeMosaicSize * 1.5);
      }
    }
    function CreateMosaic(context, width,height,mosaicSize) {
      var x=0;
      var y=0;
      for (y = 0; y < height; y = y + mosaicSize) {
        for (x = 0; x < width; x = x + mosaicSize) {
          var cR = imageData.data[(y * width + x) * 4];
          var cG = imageData.data[(y * width + x) * 4 + 1];
          var cB = imageData.data[(y * width + x) * 4 + 2];
          context.fillStyle = "rgb("+cR+","+cG+","+cB+")";
          context.fillRect(x, y, x + mosaicSize, y + mosaicSize);
        }
      }
    }
  </script>
</head>
<body onload="loadImage();" style="background-color:#D0D0D0;">
  <canvas id="SimpleCanvas" width="640" height="360" style="background-color:#FFFFFF;"></canvas>
  <div>Canvas Demo</div>
  <div id="output"></div>
</body>
</html>
로그인 후 복사

설명:

이전 코드를 처리한 후 2초 간격으로 실행한 뒤, 그 간격에서 onFadeOut을 실행하는데, 페이드 아웃되기 전에 실행되는 코드입니다.

실행 결과

위 HTML 파일을 실행하면 다음과 같은 모자이크 효과가 나타납니다

HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?

그러면 다음과 같이 점차 선명해집니다

HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?

그 후 약 2분 동안 이미지가 표시됩니다. 몇 초 후, 이미지에 아래 그림과 같이 모자이크 효과가 나타나기 시작합니다

HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?

그러면 모자이크가 점차 두꺼워지고 마침내 아래 그림과 같이 숨겨지며 페이지에는 아무것도 없습니다

HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?

위 내용은 HTML5 캔버스는 모자이크(코드)의 페이드인 및 페이드아웃 효과를 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿