Advertisement
here2share

TwoToneContours.html

Nov 23rd, 2024
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>TwoToneContours</title>
  7.     <style>
  8.         canvas {
  9.             border: 1px solid black;
  10.         }
  11.     </style>
  12. </head>
  13. <body>
  14.     <canvas id="patternCanvas" width="640" height="640"></canvas>
  15.     <button onclick="createPattern()">REGENERATE</button>
  16.  
  17.     <script>
  18.         const canvas = document.getElementById('patternCanvas');
  19.         const ctx = canvas.getContext('2d');
  20.         const ww = canvas.width;
  21.         const hh = canvas.height;
  22.         const p = 64;
  23.         const n = 50;
  24.  
  25.         function createGrid() {
  26.             const grid = new Array(hh + p).fill(null).map(() => new Array(ww + p).fill(255));
  27.             for (let y = 0; y < hh + p; y += 32) {
  28.                 for (let x = 0; x < ww + p; x += 32) {
  29.                     const color = Math.random() > 0.5 ? 0 : 255;
  30.                     for (let i = 0; i < 32; i++) {
  31.                         for (let j = 0; j < 32; j++) {
  32.                             grid[y + i][x + j] = color;
  33.                         }
  34.                     }
  35.                 }
  36.             }
  37.             return grid;
  38.         }
  39.  
  40.         function displayPattern(grid) {
  41.             ctx.clearRect(0, 0, ww, hh);
  42.             for (let y = 0; y < hh + p; y++) {
  43.                 for (let x = 0; x < ww + p; x++) {
  44.                     ctx.fillStyle = `rgb(${grid[y][x]}, ${grid[y][x]}, ${grid[y][x]})`;
  45.                     ctx.fillRect(x, y, 1, 1);
  46.                 }
  47.             }
  48.         }
  49.  
  50.         function applyBlur() {
  51.             ctx.filter = 'blur(20px)';
  52.             ctx.drawImage(canvas, 0, 0);
  53.             ctx.filter = 'none';
  54.         }
  55.  
  56.         function twoTone() {
  57.             const imageData = ctx.getImageData(0, 0, ww, hh);
  58.             const data = imageData.data;
  59.             for (let i = 0; i < data.length; i += 4) {
  60.                 const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;
  61.                 const newColor = avg > 128 ? 255 : 0;
  62.                 data[i] = newColor;
  63.                 data[i + 1] = newColor;
  64.                 data[i + 2] = newColor;
  65.             }
  66.             ctx.putImageData(imageData, 0, 0);
  67.         }
  68.  
  69.         function cropAndResize() {
  70.             const croppedCanvas = document.createElement('canvas');
  71.             const croppedCtx = croppedCanvas.getContext('2d');
  72.             croppedCanvas.width = ww - 2 * n;
  73.             croppedCanvas.height = hh - 2 * n;
  74.             croppedCtx.drawImage(canvas, n, n, ww - 2 * n, hh - 2 * n, 0, 0, ww - 2 * n, hh - 2 * n);
  75.  
  76.             ctx.clearRect(0, 0, ww, hh);
  77.             ctx.drawImage(croppedCanvas, 0, 0, ww - 2 * n, hh - 2 * n, 0, 0, ww, hh);
  78.         }
  79.  
  80.         function createPattern() {
  81.             const grid = createGrid();
  82.             displayPattern(grid);
  83.             applyBlur();
  84.             twoTone();
  85.             cropAndResize();
  86.         }
  87.  
  88.         createPattern();
  89.     </script>
  90. </body>
  91. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement