Foros del Web » Programando para Internet » Javascript »

Rellenar polígono en canvas con imagen

Estas en el tema de Rellenar polígono en canvas con imagen en el foro de Javascript en Foros del Web. Buenas a todos. Tengo una herramienta en html5 y javascript que toma una imagen (sin suavizar), muestra una paleta de colores dada y permite modificar ...
  #1 (permalink)  
Antiguo 08/07/2015, 11:54
 
Fecha de Ingreso: marzo-2008
Mensajes: 207
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta Rellenar polígono en canvas con imagen

Buenas a todos.

Tengo una herramienta en html5 y javascript que toma una imagen (sin suavizar), muestra una paleta de colores dada y permite modificar las diferentes zonas de la imagen con el color elegido de la paleta (como si fuera Paint).

Lo que necesito es que en vez de rellenar con un color plano rellene la area clicada con una imagen de fondo, como imitando una textura. Estoy trabajando con archivos png sin suavizar, pero no termino de encontrar la solución para sustituir las áreas de color por imágenes a modo de textura.

He encontrado un par de librearías por ahí (Fabric y Babylon), pero no termino de encontrar en su documentación cómo hacer esto, y también he mirado documentación sobre las etiquetas svg y polygon de html5, pero tampoco veo cómo cargar un svg a modo de "plantilla" para poder modificarlo y asignarle a cada área o polígono una imagen de fondo de relleno.

¿Alguien sabría indicarme alguna librería o alguna función para poder hacer esto? Es lo último que necesito hacer para terminar la herramienta y me está dando bastantes problemas.

Os dejo el código de la herramienta por si queréis echarle un ojo:
Código HTML:
Ver original
  1. <!DOCTYPE HTML>
  2.   <head>
  3.     <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  4.     <title></title>
  5.   </head>
  6.   <body onload="cargarDibujo();">
  7.     <canvas id="dibujo" width="500" height="500" onclick="cambiarColor();" onmousemove="setCoords(event);" style="position: relative; border: 0;"></canvas>
  8.     <hr />
  9.     <div id="colorElegido" style="display: block; width: 100px; height: 100px; border: 1px solid #000;"></div>
  10.     <p id="coords"></p>    
  11.     <hr />
  12.     <button style="display: block; width: 20px; height: 20px; border: 1px solid #000; background-color: #FFFFFF;" onclick="setColor('#FFFFFF');"></button>
  13.     <button style="display: block; width: 20px; height: 20px; border: 1px solid #000; background-color: #FF0000;" onclick="setColor('#FF0000');"></button>
  14.     <button style="display: block; width: 20px; height: 20px; border: 1px solid #000; background-color: #00FF00;" onclick="setColor('#00FF00');"></button>
  15.     <button style="display: block; width: 20px; height: 20px; border: 1px solid #000; background-color: #0000FF;" onclick="setColor('#0000FF');"></button>
  16.     <button style="display: block; width: 20px; height: 20px; border: 1px solid #000; background-color: #000000;" onclick="setColor('#000000');"></button>
  17.   </body>
  18.  
  19.   <script type="text/javascript">
  20.       var colorNuevoHex;
  21.       var mouseX, mouseY;
  22.       var marco = document.getElementById('dibujo');
  23.       var contexto = marco.getContext('2d');
  24.       var imagenCompleta;
  25.       var colorZonaHex;
  26.       var colorZonaRGB;
  27.      
  28.       function cargarDibujo() {
  29.         marco.width = marco.width;
  30.         var img = new Image();
  31.         img.src = 'khatim-kmar.png';
  32.         img.onload = function() {
  33.           contexto.drawImage(img, 0, 0);
  34.           imagenCompleta = contexto.getImageData(0, 0, marco.width, marco.height);
  35.           contexto.putImageData(imagenCompleta, 0, 0);
  36.         }
  37.       }
  38.      
  39.       function setColor(color) {
  40.         colorNuevoHex = color;
  41.         document.getElementById('colorElegido').style.backgroundColor = colorNuevoHex;
  42.       }
  43.      
  44.       function cambiarColor() {
  45.         var imgData = contexto.getImageData(mouseX, mouseY, 1, 1);
  46.         var colorNuevoRGB = hexToRgb(colorNuevoHex);  
  47.         colorZonaRGB = [imgData.data[0], imgData.data[1], imgData.data[2]];
  48.         colorZonaHex = rgbToHex(imgData.data[0], imgData.data[1], imgData.data[2]);
  49.         for (var i=0; i < imagenCompleta.data.length; i+=4) {
  50.          // is this pixel the old rgb?
  51.          if ((imagenCompleta.data[i] == imgData.data[0]) && (imagenCompleta.data[i+1] == imgData.data[1]) && (imagenCompleta.data[i+2] == imgData.data[2])){
  52.              // change to your new rgb
  53.              imagenCompleta.data[i] = colorNuevoRGB.r;
  54.              imagenCompleta.data[i+1] = colorNuevoRGB.g;
  55.              imagenCompleta.data[i+2] = colorNuevoRGB.b;
  56.          }
  57.        }
  58.        
  59.        contexto.putImageData(imagenCompleta, 0, 0);
  60.      }              
  61.      
  62.      function setCoords(e) {
  63.        if(e.offsetX) {
  64.            mouseX = e.offsetX;
  65.            mouseY = e.offsetY;
  66.        }
  67.        else if(e.layerX) {
  68.            mouseX = e.layerX;
  69.            mouseY = e.layerY;
  70.        }
  71.        
  72.        document.getElementById('coords').innerHTML = mouseX+' X' + ', ' + mouseY + ' Y';
  73.      }
  74.      
  75.      function componentToHex(c) {
  76.          var hex = c.toString(16);
  77.          return hex.length == 1 ? "0" + hex : hex;
  78.      }
  79.      
  80.      function rgbToHex(r, g, b) {
  81.          return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
  82.      }
  83.      
  84.      function hexToRgb(hex) {
  85.          // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  86.          var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  87.          hex = hex.replace(shorthandRegex, function(m, r, g, b) {
  88.              return r + r + g + g + b + b;
  89.          });
  90.      
  91.          var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  92.          return result ? {
  93.              r: parseInt(result[1], 16),
  94.              g: parseInt(result[2], 16),
  95.              b: parseInt(result[3], 16)
  96.          } : null;
  97.      }
  98.    </script>  
  99. </html>

Etiquetas: canvas, html, rellenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:46.