Animating canvas to look like tv noise

前端 未结 7 2133
野趣味
野趣味 2020-12-22 17:22

I have a function named generateNoise() which creates a canvas element and paints random RGBA values to it; which, gives the appearance of noise.


<
相关标签:
7条回答
  • 2020-12-22 18:07

    Mine doesn't look identical to real TV static, but it's similar nonetheless. I'm just looping through all the pixels on canvas, and changing the RGB colour components of each pixel at a random coordinate to a random colour. The demo can be found over at CodePen.

    The code is as follows:

    // Setting up the canvas - size, setting a background, and getting the image data(all of the pixels) of the canvas. 
    canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d");
    canvas.width = 400;
    canvas.height = 400;
    canvasData = ctx.createImageData(canvas.width, canvas.height);
    
    //Event listeners that set the canvas size to that of the window when the page loads, and each time the user resizes the window
    window.addEventListener("load", windowResize);
    window.addEventListener("resize", windowResize);
    
    function windowResize(){
      canvas.style.width = window.innerWidth + 'px';
      canvas.style.height = window.innerHeight + 'px';
    }
    
    //A function that manipulates the array of pixel colour data created above using createImageData() 
    function setPixel(x, y, r, g, b, a){
      var index = (x + y * canvasData.width) * 4;
    
      canvasData.data[index] = r;
      canvasData.data[index + 1] = g;
      canvasData.data[index + 2] = b;
      canvasData.data[index + 3] = a;
    }
    
    window.requestAnimationFrame(mainLoop);
    
    function mainLoop(){
      // Looping through all the colour data and changing each pixel to a random colour at a random coordinate, using the setPixel function defined earlier
      for(i = 0; i < canvasData.data.length / 4; i++){
        var red = Math.floor(Math.random()*256);
        var green = Math.floor(Math.random()*256);
        var blue = Math.floor(Math.random()*256);
        var randX = Math.floor(Math.random()*canvas.width); 
        var randY = Math.floor(Math.random()*canvas.height);
    
        setPixel(randX, randY, red, green, blue, 255);
      }
    
      //Place the image data we created and manipulated onto the canvas
      ctx.putImageData(canvasData, 0, 0);
    
      //And then do it all again... 
      window.requestAnimationFrame(mainLoop);
    }
    
    0 讨论(0)
提交回复
热议问题