Advertisement
here2share

LineContour.html

Nov 23rd, 2024
186
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>LineContour</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 lineContour() {
  70.             const imageData = ctx.getImageData(0, 0, ww, hh);
  71.             const data = imageData.data;
  72.             const contourCanvas = document.createElement('canvas');
  73.             const contourCtx = contourCanvas.getContext('2d');
  74.             contourCanvas.width = ww;
  75.             contourCanvas.height = hh;
  76.             contourCtx.lineWidth = 1.5;
  77.             contourCtx.strokeStyle = 'black';
  78.  
  79.             for (let y = 1; y < hh - 1; y++) {
  80.                 for (let x = 1; x < ww - 1; x++) {
  81.                     const idx = (y * ww + x) * 4;
  82.                     const current = data[idx];
  83.                     const left = data[idx - 4];
  84.                     const right = data[idx + 4];
  85.                     const top = data[idx - ww * 4];
  86.                     const bottom = data[idx + ww * 4];
  87.  
  88.                     if (current !== left || current !== right || current !== top || current !== bottom) {
  89.                         contourCtx.beginPath();
  90.                         contourCtx.moveTo(x, y);
  91.                         contourCtx.lineTo(x + 1, y + 1);
  92.                         contourCtx.stroke();
  93.                     }
  94.                 }
  95.             }
  96.  
  97.             ctx.clearRect(0, 0, ww, hh);
  98.             ctx.drawImage(contourCanvas, 0, 0);
  99.         }
  100.  
  101.         function cropAndResize() {
  102.             const croppedCanvas = document.createElement('canvas');
  103.             const croppedCtx = croppedCanvas.getContext('2d');
  104.             croppedCanvas.width = ww - 2 * n;
  105.             croppedCanvas.height = hh - 2 * n;
  106.             croppedCtx.drawImage(canvas, n, n, ww - 2 * n, hh - 2 * n, 0, 0, ww - 2 * n, hh - 2 * n);
  107.  
  108.             ctx.clearRect(0, 0, ww, hh);
  109.             ctx.drawImage(croppedCanvas, 0, 0, ww - 2 * n, hh - 2 * n, 0, 0, ww, hh);
  110.         }
  111.  
  112.         function createPattern() {
  113.             const grid = createGrid();
  114.             displayPattern(grid);
  115.             applyBlur();
  116.             cropAndResize();
  117.             twoTone();
  118.             lineContour();
  119.         }
  120.  
  121.         createPattern();
  122.     </script>
  123. </body>
  124. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement