HTML5 Game - Manipulating video as image

Description

Manipulating video as image

Demo

ResultView the demo in separate window

<!DOCTYPE html>

<html>
  <head>
    <title>Manipulating images and video</title>
    <meta charset="utf-8">
    /*w  ww . j  a  va 2s  . c  om*/
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    
    <script type="text/javascript">
      $(document).ready(function() {  
        let video = $("#myVideo");
        
        // Trigger for video play button
        $("#play").click(function() {
          video.get(0).play();
        });
        
        // Trigger for video stop button
        $("#stop").click(function() {
          video.get(0).pause();
        });    
        
        let canvas = $("#myCanvas");
        let context = canvas.get(0).getContext("2d");
        
        video.bind("play", function() {
          drawCanvas();
        });
        
        function drawCanvas() {
          if (video.get(0).paused || video.get(0).ended)
            return false;
            
          context.drawImage(video.get(0), 0, 0, 500, 281);
          
          let imageData = context.getImageData(0, 0, canvas.width(), canvas.height());
          let pixels = imageData.data;
          
          // Clear the image
          context.clearRect(0, 0, canvas.width(), canvas.height());
          
          // Number of tiles
          let numTileRows = 36;
          let numTileCols = 64;
          
          // Dimensions of each tile
          let tileWidth = imageData.width/numTileCols;
          let tileHeight = imageData.height/numTileRows;
          
          // Loop through each tile
          for (let r = 0; r < numTileRows; r++) {
            for (let c = 0; c < numTileCols; c++) {
              let x = (c*tileWidth)+(tileWidth/2);
              let y = (r*tileHeight)+(tileHeight/2);
              
              // Use Math.floor to convert the pixel positions to integers
              let pos = (Math.floor(y)*(imageData.width*4))+(Math.floor(x)*4);
              
              let red = pixels[pos];
              let green = pixels[pos+1];
              let blue = pixels[pos+2];
              
              context.fillStyle = "rgb("+red+", "+green+", "+blue+")";
              
              // Draw the pixelated rectangle
              context.fillRect(x-(tileWidth/2), y-(tileHeight/2), tileWidth, tileHeight);
              
            };
          };
          
          setTimeout(drawCanvas, 30);
        };
      });
    </script>
  </head>
  
  <body>        
    <canvas id="myCanvas" width="500" height="281">
      <video id="myVideo" width="500" height="281" controls="true">
        <source src="http://java2s.com/style/demo/your.webm" type="video/webm"></source>
      </video>      
    </canvas>
    
    <div>
      <button id="play">Play</button>
      <button id="stop">Stop</button>
    </div>
  </body>
</html>

Related Topic