Como crear patrones

facebook-svg gplus-svg twitter-svg

El <canvas> nos lo pone fácil a la hora de crear y utilizar patrones ( patterns ). Un patrón puede ser creado a partir de una imagen, un video, o incluso de otro <canvas>, y puede ser configurado para repetirse en todas las direcciones ( repeat ), o puede repetirse en una sola dirección, ( en repeat-x o en repeat-y ). Incluso puede ser configurado para que no se repita ( no-repeat ).
Para crear patrones utilizamos el método createPattern(img, dir). El primer argumento representa la imagen que utilizamos para nuestro patrón. El segundo argumento representa la dirección, y puede tomar los siguientes valores, que tienen el mismo significado que en el CSS: no-repeat, repeat, repeat-x y repeat-y.

  JavaScript Descripción Defecto
fillStyle context.fillStyle=color|gradient|pattern; Determina o devuelve el color, gradiente o patrón del relleno. black
strokeStyle context.strokeStyle = color | gradiente | patrón; Determina o devuelve el color, gradiente o patrón de la línea. negro
createPattern() context.createPattern(img,"repeat | repeat-x | repeat-y | no-repeat"); Repite una imagen en la dirección especificada.  
fillRect() context.fillRect(x,y,anchura,altura); Dibuja y rellena un rectángulo desde un punto (x,y). black
fillText() context.fillText(text,x,y,maxWidth); maxWidth opcional black;
fill() context.fill(); Rellena una forma geométrica. black

Vea la chuleta con las propiedades y metodos() de canvas.

Crear un patrón desde una imagen

Cuando creamos un patrón desde una imagen es mejor hacerlo cuando la imagen se haya cargado (img.onload), ya que las imágenes pueden cargarse lentamente, y probar a crear un patrón desde una imagen inexistente, resultaría en error.
Para que esto no pase, tenemos que escribir una función anónima que crea el patrón, y enlazamos esta función como retrollamada ( callback ) al evento onload.

Veamos un ejemplo.
A continuación utilizamos una pequeña imagen como patrón para nuestro <canvas>. pattern
Creamos el patrón ( pattern ) utilizando el método createPattern() y asignamos su valor a la propiedad fillStyle(), para un relleno, o a la propiedad strokeStyle() para dibular un borde.

Su navegador no soporta canvas :( 

	var canvas = document.getElementById("lienzo");
		if (canvas && canvas.getContext) {
		var ctx = canvas.getContext("2d");
			if (ctx) {
						// crear un patrón de relleno desde una imagen
						var patron = new Image();
						patron.src = "images/pattern.png";
						patron.onload = function() {
						ctx.fillStyle = ctx.createPattern(patron,"repeat");
						ctx.fillRect(50,50, canvas.width-100, canvas.height-100);
						// crear un borde utilizando un patrón
						ctx.strokeStyle = ctx.createPattern(patron,"repeat");
						ctx.lineWidth = 20;
						ctx.strokeRect(10,10, canvas.width-20, canvas.height-20);
						}
				}
		}
Su navegador no soporta canvas :(

Crear un patrón desde otro canvas

También podemos crear patrones utilizando otro canvas en lugar de imagen.
Veamos un ejemplo.
Primero dibujamos en un pequeño canvas (id="patron" width="10" height="15") una línea oblicua. Esta será la imagen que se repitirá para crear un patrón en el otro canvas (id="lienzo1" width="200" height="160").
En producción este puede ser un canvas virtual, creado con document.createElement("canvas") y que no aparece en el DOM.

Su navegador no soporta canvas :( 
Su navegador no soporta canvas :( 

	var canvasP = document.getElementById("patron");
		if (canvasP && canvasP.getContext) {
		var ctxP = canvasP.getContext("2d");
			if (ctxP) {
				 // creamos el patrón.
					ctxP.lineWidth = 1;
					ctxP.strokeStyle = "#ccc";
					ctxP.beginPath();
					ctxP.moveTo(canvasP.width, 0);
					ctxP.lineTo(0, canvasP.height);
					ctxP.stroke();
				}
		}
		
		var canvas1 = document.getElementById("lienzo1");
		if (canvas1 && canvas1.getContext) {
		var ctx1 = canvas1.getContext("2d");
			if (ctx1) {
				ctx1.save();
				// aplicamos el patrón
				ctx1.fillStyle = ctx1.createPattern(canvasP,"repeat");
				ctx1.fillRect(0,0, canvas1.width, canvas1.height);
				
				ctx1.restore();
				ctx1.font="18px Arial";    
				ctx1.textAlign="center"; 
				ctx1.textBaseline="middle";    
				ctx1.fillText("lienzo1", canvas1.width/2, canvas1.height/2); 				
				}
		}
Su navegador no soporta canvas :( Su navegador no soporta canvas :(