En el Manual de Canvas ya vimos cómo trabajar con imágenes, para conseguir que dentro de un lienzo se pueda colocar una imagen o parte de ella. Esos conocimientos también nos servirán en gran medida para el trabajo con patrones.
La imagen que deseamos utilizar la podemos sacar de un objeto Image de Javascript y el tipo de repetición es similar al que se utiliza cuando se define un fondo de imagen en CSS: "repeat" (para un mosaico que se repite tanto en la horizontal como en la vertical, "repeat-x" (para repeticiones en la horizontal), "repeat-y" (para repetir la imagen en la vertical) y "no-repeat", que no producirá ninguna repetición).
Una vez que tenemos definido un patrón todavía tenemos la mitad de trabajo por delante para trabajar. Ese patrón simplemente estará declarado como objeto en Javascript y listo para usar en un canvas, pero para ello debemos configurar el estilo de relleno y luego rellenar de color un área.
var miPatron = ctx.createPattern(objeto_imagen, 'repeat');
Con la línea anterior tendríamos creada una variable miPatron que contiene un patrón de imagen listo para ser utilizado.
ctx.fillStyle = miPatron;
Con esto conseguimos que, la próxima vez que se rellene de color un área, se haga con un mosaico de imagen o pattern, en lugar de un color plano.
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
Con esta línea rellenaríamos de color todo el área disponible en el elemento canvas, es decir, un rectángulo que va desde la coordenada (0,0) hasta toda la anchura y la altura del canvas. Como previamente se aplicó el patrón a la propiedad fillStyle, en vez de rellenar con un color se rellenará con un mosaico de imagen.
window.onload = function(){
//Recibimos el elemento canvas
var ctx = cargaContextoCanvas('micanvas');
if(ctx){
//Creo una imagen con un objeto Image de Javascript
var img = new Image();
//indico la URL de la imagen
img.src = 'logo-desarrolloweb.gif';
//defino el evento onload del objeto imagen
img.onload = function(){
//Creo un "pattern" en el canvas
var miPatron = ctx.createPattern(img, 'repeat');
ctx.fillStyle = miPatron;
ctx.fillRect(0,0,ctx.canvas.width,ctx.canvas.height);
}
}
}
Este ejemplo se puede ver en una página en marcha.
Como hemos visto, no hay mucho misterio en el uso de patrones. Es un poco más laborioso que colocar una imagen en el canvas, pero mucho menos que si tuviéramos que escribir un script para realizar el mosaico "a mano".