Como crear patrones
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>. 
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.
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);
}
}
}
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.
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);
}
}