Académique Documents
Professionnel Documents
Culture Documents
General
Método JavaScript Descripción Defecto
width canvas.width Determina (sets) o devuelve (returns) la anchura del canvas 300
height canvas.height Determina (sets) o devuelve (returns) la altura del canvas 150
Líneas
Propiedad JavaScript Descripción Defecto
Rectángulos
Método JavaScript Descripción Defecto
Trazados
Método JavaScript Descripción Defecto
360° = 2Π radianes.
Método JavaScript Descripción Defecto
arcTo() context.arcTo( x1,y1,x2,y2,r ); Crea un arco de círculo entre dos tangentes x1, y1 y x2, y2
Transformations
Método JavaScript Descripción Defecto
translate() context.translate(x,y); Mueve el origen (0,0) del <canvas> en un punto dado (x,y).
Text
Propiedad JavaScript Descripción Defecto
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | ideographic | alphabetic
alineación vertical del texto.
bottom";
Image Drawing
Método JavaScript Descripción Defecto
Pixel Manipulation
Propiedad JavaScript Descripción Defecto
data imageData.data Devuelve un objeto conteniendo todos los datos del objeto ImageData.
Compositing
Propiedad JavaScript Descripción Defecto
Other
Método JavaScript Descripción Defecto
La etiqueta <canvas> se utiliza para dibujar gráficos. Cualquier texto dentro de este elemento se mostrará solo en los navegadores que no soportan <canvas>.
El canvas cuenta con varias métodos() y propiedades. A continuación algunas de ellas.
width canvas.width Determina (sets) o devuelve (returns) la anchura del canvas 300
height canvas.height Determina (sets) o devuelve (returns) la altura del canvas 150
<canvas id= "Canvas1" width= "250" height= "220">Su navegador no soporta canvas :( </canvas>
Sin embargo, el elemento <canvas> no tiene habilidad de dibujo en sí mismo, siendo sólo un contenedor para gráficos. Por esto es importante que el <canvas> tenga
asignado un id, ya que habrá que manipularlo a través deJavaScript. Utilizaremos document.getElementById para encontrar el canvas.
El método getContext() devuelve un objeto ( puede llamar este objeto como quiera; a continuación lo llamaremosctx ) que proporciona métodos() y propiedades para
dibujar en el canvas.
window.onload = function() {
// encuentre el canvas para dibujar.
var canvas = document.getElementById("Canvas1");
// si existe el canvas y si tiene el método getContext
if (canvas && canvas.getContext) {
// utilice el método getContext para recuperar el contexto del canvas
var ctx = canvas.getContext("2d");
// y si tenemos contexto
if (ctx) {
// dibujamos
}
}
}
Para dibujar necesitaremos utilizar las coordenadas x e y del canvas: arriba en la esquina izquerda x=0; y=0;; abajo en la esquina derecha x=canvas.width; y=canvas.height;.
Pase el ratón sobre el siguiente <canvas> para ver sus coordenadas x e y:
Supongamos que queremos dibujar una línea de 3px de gruesa ( line width = ancho de la línea ).
Escribimos: ctx.lineWidth = 3; Note por favor que escribimos 3 y no 3px. Si no especificamos lineWidth, el ancho de línea será de 1px.
Queremos tambien que nuestra línea sea roja. ( stroke style = estilo de trazado ).
Escribimos: ctx.strokeStyle = "#f00"; Si no especificamos strokeStyle, el el color del trazado será negro.
Decidido todo esto empezamos a dibujar:
ctx.beginPath();
Nuestro lapiz tocará el canvas a x=20px, y=230px.
ctx.moveTo(20, 230);
Esbozamos una línea desde x=20px, y=130px ( el punto definido anteriormente ) a x=230px, y=20px.
ctx.lineTo(230, 20);
Finalmente trazamos nuestra linea. Note por favor que sin stroke() no habrá línea: ( ctx.stroke(); )
<canvas id= "linea1" width= "250" height= "150">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("linea1");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
ctx.lineWidth = 3;
ctx.strokeStyle = "#f00";
ctx.beginPath();
ctx.moveTo(20, 130);
ctx.lineTo(230, 20);
ctx.stroke();
}
}
}
Como dibujar líneas finas
Por defecto el <canvas> de HTML5 “suaviza” las líneas, y esto queda muy bien en las líneas oblicuas. Sin embargo las líneas horizontales y verticales parecen más gruesas de
lo que son en realidad. Esto llega a ser muy evidente, incluso molesto, en líneas muy finas (ctx.lineWidth = 1), por ejemplo las coordenadas de un gráfico.
La buena noticia es que podemos eludir este problema utilizando el método translate().
<canvas id= "linea2" width= "250" height= "75">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas2 = document.getElementById("linea2");
if (canvas2 && canvas2.getContext) {
var ctx = canvas2.getContext("2d");
if (ctx) {
ctx.lineWidth = 1;
ctx.strokeStyle = "#f00";
//dibuja la primera línea
ctx.beginPath();
ctx.moveTo(20, 25);
ctx.lineTo(230, 25);
ctx.stroke();
// dibuja una segunda línea MÁS FINA;
ctx.translate(0, .5);
Puntas de línea (lineCap)
Para dibujar lineas en el <canvas>, además de los metodos que ya hemos visto, podemos utilizar la propiedadlineCap para dar formato a las puntas de línea. Los valores que
puede tomar lineCap son "butt" (tope), "round"(redondeado) y "square" (cuadrado)
JavaScript Descripción Defecto
Uniones de línea
Podemos dibujar un trazado en el <canvas> conectando lineas y curvas. Al conectar dos líneas podemos escoger también el tipo de unión.
JavaScript Descripción Defecto
arcTo() context.arcTo(x1,y1,x2,y2,r); Crea un arco de círculo entre dos tangentes x1, y1 y x2, y2
En el canvas para trabajar con ángulos, utilizaremosradianes. Un circulo completo tiene 2π radianes, con lo cual podemos escribir: 360° = 2π rad;
o si hablamos JavaScript: 2*Math.PI;
Para convertir grados sexagesimales a radianes utilizaremos la siguiente fórmula:
radianes = (π / 180) * grados;
o en JavaScript escribiremos:
var radianes = (Math.PI / 180) * grados;
Dibujar un arco
Para dibujar un arco utilizaremos el método arc(x, y, r, ap, af, aC), donde x e y son las coordenadas del centro, ap es el ángulo de partida ( en radianes ), af es el ángulo final
( en radianes ), y cR ( contra reloj ) es la dirección. El parametro cR puede tomar dos valores: true ( verdadero, o sea: en sentido contrario al de las agujas del reloj )
y false ( falso, o sea: en el sentido de las agujas del reloj ).
<canvas id= "arco" width= "250" height= "150">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var elCanvas = document.getElementById("arco");
if (elCanvas && elCanvas.getContext) {
var context = elCanvas.getContext("2d");
if (context) {
var X = elCanvas.width/2;
var Y = 100;
var r = 50;
var aPartida = (Math.PI / 180) * 220;
var aFinal = (Math.PI / 180) * 320;
context.strokeStyle = "orange";
context.lineWidth = 15;
context.arc(X,Y,r,aPartida,aFinal,false);
context.stroke();
}
}
}
Dibujar un círculo
Para dibujar un círculo hay que trazar un arco de 360° ( 2π radianes ), o sea: el ángulo de partida ap = 0 y el ángulo final (en radianes) af = 2*Math.PI
<canvas id= "lienzo" width= "250" height= "200">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var lienzo = document.getElementById("lienzo");
if (lienzo && lienzo.getContext) {
var contexto = lienzo.getContext("2d");
if (contexto) {
var X = lienzo.width/2;
var Y = lienzo.height/2;
var r = 75;
contexto.strokeStyle = "#006400";
contexto.fillStyle = "#6ab150";
contexto.lineWidth = 5;
contexto.arc(X,Y,r,0,2*Math.PI);
contexto.fill();
contexto.stroke();
}
}
}
Más geometría
Para calcular las coordenadas de un punto en la circunferencia de un círculo utilizaremos las siguientes fórmulas:
var x = centroX + r * Math.cos(a);
var y = centroY + r * Math.sin(a);
Donde centroX y centroY son las coordenadas del centro del círculo;
r es el radio del círculo;
y a es el ángulo entre el punto 0π y este punto.
Dibujar un sector circular
A continuación vamos a dibujar un sector circular de 60°, donde el ángulo de partida ap = 60° y el ángulo final af = 120°.
Necesitamos definir algunas variables:
El centro del circulo (X,Y) cuyo sector vamos a dibujar, y el radio R de este.
var X = canvas.width/2;
var Y = 30;
var R = 140;
El ángulo de partida ap y el ángulo final af
var ap = (Math.PI / 180) * 60;
var af = (Math.PI / 180) * 120;
Las coordenadas del punto de partida en la circunferencia
var Xap = X+R * Math.cos(ap);
var Yap = Y+R * Math.sin(ap);
También hay que definir el color de relleno fillStyle y el color del borde strokeStyle. Veamos el código.
<canvas id= "sectorCircular" width= "250" height= "200">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("sectorCircular");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
// El centro del circulo (X,Y) cuyo sector vamos a dibujar, y el radio R de este.
var X = canvas.width/2;
var Y = 30;
var R = 140;
// El ángulo de partida ap y el ángulo final af
var ap = (Math.PI / 180) * 60;
var af = (Math.PI / 180) * 120;
// Las coordenadas del punto de partida en la circunferencia
var Xap = X+R * Math.cos(ap);
var Yap = Y+R * Math.sin(ap);
// estilos
ctx.fillStyle = "#abcdef";
ctx.strokeStyle = "#1E90FF";
ctx.lineWidth = 5;
// empezamos a dibujar
ctx.beginPath();
ctx.moveTo(X,Y);
ctx.lineTo(Xap,Yap);
ctx.arc(X,Y,R,ap,af);
ctx.closePath();
ctx.fill();
ctx.stroke();
}
}
}
El método arcTo
En el <canvas> podemos crear esquinas redondeadas utilizando el método arcTo(). La mala noticia es que Opera no soporta el método arcTo().
JavaScript Descripción Defecto
arcTo() context.arcTo(x1,y1,x2,y2,r); Crea un arco de círculo entre dos tangentes x1, y1 y x2, y2
La propiedad arcTo()
La propiedad arcTo() crea un arco entre dos tangentes. Los parámetros utilizados son:
x1, y1 Las coordenadas x e y del primer punto de control.
x2, y2 Las coordenadas x e y del primer segundo de control.
r Representa el radio de la curvatura.
La primera tangente va del punto (x0, y0) al punto (x1, y1).
La segunda tangente va del punto (x1, y1) al punto (x2, y2).
Esquinas redondeadas con arcTo
<canvas id= "arcos" width= "250" height= "200">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("arcos");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
// define el rádio
var r = 20;
// las coordenadas del rectángulo;
var x0 = 50, y0 = 50;
var x1 = 200, y1 = 50;
var x2 = 200, y2 = 150;
var x3 = 50, y3 = 150;
ctx.lineWidth = 8;
ctx.strokeStyle = "orange";
ctx.beginPath();
ctx.moveTo(x3,y3-r);
// dibuja un rectángulo con esquinas redondeadas
ctx.arcTo(x0,y0,x1,y1,r);
ctx.arcTo(x1,y1,x2,y2,r);
ctx.arcTo(x2,y2,x3,y3,r);
ctx.arcTo(x3,y3,x0,y0,r);
ctx.stroke();
}
}
}
Curvas cúbicas de Bézier
Para dibujar una curva de Bézier en el <canvas> utilizaremos, además de otros métodos() y propiedades ya conocidas, un método especifico: bezierCurveTo()
JavaScript Descripción Defecto
Repaso de Geometría
Cuatro puntos del plano: P0, P1, P2 y P3 definen una curva cúbica de Bézier. La curva empieza en el punto P0, se dirige hacia P1 y llega a P3 viniendo de la dirección del
punto P2. Usualmente, no pasará ni por P1 ni por P2. Estos puntos sólo están ahí para proporcionar información direccional.
Lea más sobre las curvas de Bézier en Wikipedia
Veamos un ejemplo. A continuación dibujaremos una curva de Bézier en el <canvas>. Utilizaremos ctx.moveTo(x0,y0) para mover el "lapiz" en el punto P0. Para esbozar la
curva utilizaremos ctx.bezierCurveTo(x1,y1,x2,y2,x3,y3);, donde x1, y1 son las coordenadas del punto P1, etc...
Para dar estilo a la curva utilizaremos como siempre las propiedades lineWidth y strokeStyle. Al final dibujaremos la curva con stroke().
Visite cubic-bezier.com (Made by Lea Verou with care). Verá un maravilloso ejemplo de curvas de Bézier, realizado con<canvas>.
<canvas id= "lienzo" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
var x0 = 20; var y0 = 160;
var x1 = 50; var y1 = 50;
var x2 = 230; var y2 = 0;
var x3 = 220; var y3 = 180;
ctx.lineWidth = 5;
ctx.strokeStyle = "#00f";
ctx.beginPath();
ctx.moveTo(x0,y0);
ctx.bezierCurveTo(x1,y1,x2,y2,x3,y3);
ctx.stroke();
}
}
}
Calcular las coordenadas de un punto en la curva
Para calcular las coordenadas de un punto en la curva de Bézier utilizaremos una fórmula encontrada en Wikipedia
<canvas id= "lienzo1" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo1");
if (canvas1 && canvas1.getContext) {
var ctx1 = canvas1.getContext("2d");
if (ctx1) {
var x0 = 20; var y0 = 160;
var x1 = 50; var y1 = 50;
var x2 = 230; var y2 = 0;
var x3 = 220; var y3 = 180;
ctx1.lineWidth = 5;
ctx1.strokeStyle = "#00f";
ctx1.beginPath();
ctx1.moveTo(x0,y0);
ctx1.bezierCurveTo(x1,y1,x2,y2,x3,y3);
ctx1.stroke();
//calculamos las coordenadas del punto
var t = .7; // toma valores entre 0 - 1
var x = (1 - t) * (1 - t) *(1 - t) * x0
+ 3 * (1 - t) * (1 - t) * t * x1
+ 3 * (1 - t) * t * t * x2
+ t * t * t * x3;
var y = (1 - t) * (1 - t) *(1 - t) * y0
+ 3 * (1 - t) * (1 - t) * t * y1
+ 3 * (1 - t) * t * t * y2
+ t * t * t * y3;
// dibujamos un punto rojo
ctx1.beginPath();
ctx1.fillStyle = "red";
ctx1.arc(x,y,10,0,2*Math.PI);
ctx1.fill();
}
}
}
Curvas cuadráticas de Bézier
Para dibujar una curva de Bézier en el <canvas> utilizaremos, además de otros métodos() y propiedades ya conocidas, un método especifico: bezierCurveTo()
JavaScript Descripción Defecto
Repaso de Geometría
Tres puntos del plano: a, pc y z definen una curva cuadrática de Bézier. La curva empieza en el punto a, se dirige hacia pc ( punto de control ) y llega a z viniendo de la
dirección del punto de control. Usualmente, no pasará por pc. Este punto sólo proporciona información direccional.
Lea más sobre las curvas de Bézier en Wikipedia
Veamos un ejemplo. A continuación dibujaremos una curva cuadrátic de Bézier en el <canvas>. Utilizaremosctx.moveTo(ax,ay) para mover el "lapiz" en el punto a. Para
esbozar la curva utilizaremos ctx.quadraticCurveTo( pcx,pcy,zx,zy ), donde pcx,pcy son las coordenadas del punto de control pc, y zx, zy son las coordenadas del punto
final z.
Para dar estilo a la curva utilizaremos como siempre las propiedades lineWidth y strokeStyle. Al final dibujaremos la curva con stroke().
<canvas id= "lienzo" width= "200" height= "190">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
var ax = 20, ay = 130;
var pcx = 40, pcy = 15;
var zx = 180, zy = 170;
ctx.strokeStyle = "blue";
ctx.lineWidth = 5;
ctx.beginPath();
ctx.moveTo(ax,ay);// aquí empieza la curva
ctx.quadraticCurveTo(pcx,pcy,zx,zy);
ctx.stroke();
}
}
}
Calcular las coordenadas de un punto en la curva
Para calcular las coordenadas de un punto en la curva de Bézier utilizaremos una fórmula encontrada en Vikipedia
<canvas id= "lienzo1" width= "200" height= "190">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo1");
if (canvas1 && canvas1.getContext) {
var ctx1 = canvas1.getContext("2d");
if (ctx1) {
var x0 = 20, y0 = 130;
var x1 = 40, y1 = 15;
var x2 = 180, y2 = 170;
ctx1.strokeStyle = "blue";
ctx1.lineWidth = 5;
ctx1.beginPath();
ctx1.moveTo(x0,y0);
ctx1.quadraticCurveTo(x1,y1,x2,y2);
ctx1.stroke();
// calculamos las coordenadas del punto
// con una fórmula encontrada en wikipedia
var t = .7; // valor entre 0 - 1
x = (1 - t) * (1 - t) * x0 + 2 * (1 - t) * t * x1 + t * t * x2;
y = (1 - t) * (1 - t) * y0 + 2 * (1 - t) * t * y1 + t * t * y2;
ctx1.beginPath();
ctx1.fillStyle = "red";
ctx1.arc(x,y,10,0,2*Math.PI);
ctx1.fill();
}
}
}
Dibujar un óvalo
Un óvalo, en geometría, es un círculo aplastado que se asemeja a una forma ovoide o elíptica. A diferencia de otras curvas, el término óvalo no está claramente definido, y
muchas curvas diferentes son llamadas óvalos. Su forma no se aparta mucho de la de una circunferencia o una elipse.
JavaScript Descripción Defecto
2=200%, etc...
Vea la chuleta con las propiedades y metodos() de canvas.
Más información acerca de los métodos save() y restore().
Para dibujar un óvalo, dibujaremos un círculo, que aplastaremos luego, utilizando el método scale().
Importante: para centrar el óvalo resultante hemos dibujado el circulo original hacia la izquierda.
<canvas id= "linea1" width= "250" height= "150">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("linea1");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
//calculamos el centro del canvas
var centroX = ctx.canvas.width/2;
var centroY = ctx.canvas.height/2;
// guardamos el estado inicial
ctx.save();
var radio = 50;
// modificamos la escala horizontalmente
ctx.scale(2, 1);
// dibujamos un círculo que será aplastado en un óvalo
ctx.beginPath();
ctx.arc( centroX / 2, centroY, radio, 0, 2 * Math.PI );
// restauramos el estado inicial, el de antes de modificar la escala
// de esta manera el borde no será aplastado
ctx.restore();
// trazamos el borde
ctx.lineWidth = 15;
ctx.strokeStyle = "#00f";
ctx.stroke();
}
}
}
Dibujar una elipse
En este momento no hay ningun método() de <canvas> que nos ayude dibujar elipses. Sin embargo el internet es una fuente ilimitada de recursos donde podemos
encontrar de todo, incluso funciones que nos facilita dibujar elipses.
JavaScript Descripción Defecto
ctx.beginPath();
ctx.lineWidth = lw;
ctx.strokeStyle = "#00f";
ctx.moveTo( x, ym );
ctx.bezierCurveTo( x, ym - oy, xm - ox, y, xm, y );
ctx.bezierCurveTo( xm + ox, y, xf, ym - oy, xf, ym );
ctx.bezierCurveTo( xf, ym + oy, xm + ox, yf, xm, yf );
ctx.bezierCurveTo( xm - ox, yf, x, ym + oy, x, ym );
ctx.closePath();
ctx.stroke();
}
}
Cerrar un trazado
Podemos dibujar formas geometricas en el <canvas> conectando varias líneas en un trazado. Para cerrar el trazado podemos dibujar una línea que une el el último punto
con el origen de nuestro trazado, o podemos utilizar el método closePath() (cerrar trazado) y dejar el HTML5 que lo haga para nosotros.
JavaScript Descripción Defecto
Rectángulos
Los rectángulos son por ahora las únicas formas geometricas primitivas soportadas por <canvas>. O sea: podemos dibujar rectángulos utilizando métodos y propiedades
especificas.
Método JavaScript Descripción Defecto
strokeStyle context.strokeStyle = color | gradient | Determina o devuelve el color, gradiente o patrón negro
Método JavaScript Descripción Defecto
pattern; de la línea.
// un angulo de 60 deg.
var rad = ( Math.PI / 180 ) * 60;
ctx.beginPath();
for( var i = 0; i<6; i++ ){
x = X + R * Math.cos( rad*i );
y = Y + R * Math.sin( rad*i );
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill();
}
}
}
Polígonos regulares
Un polígono regular es un polígono en el que todos los lados tienen la misma longitud y todos los ángulos interiores tienen el mismo valor. Todos los polígonos regulares se
pueden inscribir perfectamente en una circunferencia.
Para dibujar un polígono regular, ( o cualquier otro trazado ) necesitamos definir algunas propiedades de <canvas>
ctx.fillStyle = "#6ab150";
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
Todos los polígonos regulares se pueden inscribir en una circunferencia. Por lo tanto definiremos la posición del centro y el radio de este círculo:
var X = canvas.width/2;
var Y = canvas.height / 2;
var R = 100;
Y lo más importante: definiremos el número de lados L del polígono.
var L = 5;
Todos los ángulos centrales de un polígono regular son iguales entre si y su medida rad puede obtenerse a partir del número de lados L del polígono:
var rad= 2*Math.PI / L
Para dibujar el trazado utilizaremos un bucle for ( for loop ), donde con cada paso del bucle dibujaremos un lado del polígono.
<canvas id= "lienzo" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
ctx.fillStyle = "#6ab150";
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
var X = canvas.width/2;
var Y = canvas.height/2;
var R = 100;
// el número de lados del polígono
var L = 5;
// si L == 6 el ángulo es de 2π/6 o sea 60°
var rad = (2*Math.PI)/L;
// dibuja el trazado
ctx.beginPath();
for( var i = 0; i<L; i++ ){
x = X + R * Math.cos( rad*i );
y = Y + R * Math.sin( rad*i );
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
}
}
}
Arreglar desperfectos
El pentágono ha salido muy bien, pero no estaría nada mal poder girarlo alrededor de su centro. Para esto tendremos que utilizar dos otros métodos
del <canvas>: translate() y rotate(). Como que trasladaremos el contexto en el centro del <canvas> tendremos que redefinir las variables X e Y.
var X = 0;
var Y = 0;
Veamos como queda.
<canvas id= "lienzo1" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo1");
if (canvas1 && canvas1.getContext) {
var ctx = canvas1.getContext("2d");
if (ctx) {
ctx.fillStyle = "#6ab150";
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
var X = 0;
var Y = 0;
var R = 100;
var L = 5;
// si L == 6 el ángulo es de 2π/6 o sea 60°
var rad = (2*Math.PI)/L;
// traslada el contexto en el centro del canvas
// para poder girar el contexto alrededor del centro
ctx.translate(canvas1.width/2, canvas1.height/2);
//gira el contexto unos 270º
ctx.rotate(3*Math.PI/2);
// dibuja el trazado
ctx.beginPath();
for( var i = 0; i<L; i++ ){
x = X + R * Math.cos( rad*i );
y = Y + R * Math.sin( rad*i );
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill();
ctx.stroke();
}
}
}
.
Dibujar estrellas
Las estrellas que dibujaremos a continuación son polígonos estrellados, y pueden trazarse "sin levantar el lápiz".
Para dibujar una estrella, ( o cualquier otro trazado ) necesitamos definir algunas propiedades de <canvas>
ctx.fillStyle = "#6ab150";
ctx.strokeStyle = "black";
ctx.lineWidth = 3;
Las estrellas, como los demás polígonos regulares, se pueden inscribir en una circunferencia. Por lo tanto definiremos la posición del centro y el radio de este círculo:
var X = canvas.width/2;
var Y = canvas.height / 2;
var R = 100;
Y lo más importante: definiremos el número de lados L de la estrella y el paso.
var L = 5;
var paso = 2
Todos los ángulos son iguales entre si y su medida rad puede obtenerse a partir del número de lados L del polígono:
var estrella = L / paso
var rad= 2*Math.PI / estrella
Para dibujar el trazado utilizaremos un bucle for ( for loop ), donde con cada paso del bucle dibujaremos un lado de la estrella.
<canvas id= "lienzo" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
ctx.fillStyle = "#6ab150";
ctx.lineWidth = 6;
var X = canvas.width / 2;
var Y = canvas.height / 2;
var R = 100;
var L = 5;
var paso = 2
ctx.beginPath();
for( var i = 0; i<L; i++ ){
x = X + R * Math.cos( rad*i );
y = Y + R * Math.sin( rad*i );
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.stroke();
ctx.fill();
}
}
}
Arreglar desperfectos
La estrella ha salido muy bien, pero no estaría nada mal poder girarlo alrededor de su centro. Para esto tendremos que utilizar dos otros métodos
del <canvas>: translate() y rotate(). Como que trasladaremos el contexto en el centro del <canvas> tendremos que redefinir las variables X e Y.
var X = 0;
var Y = 0;
Veamos como queda.
<canvas id= "lienzo1" width= "250" height= "240">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo1");
if (canvas1 && canvas1.getContext) {
var ctx = canvas1.getContext("2d");
if (ctx) {
ctx.fillStyle ="#6ab150";
ctx.lineWidth = 6;
var X = 0;
var Y = 0;
var R = 100;
var L = 5;
var paso = 2;
var estrella= L / paso;
var rad = (2*Math.PI) / estrella;
// traslada el contexto en el centro del canvas
ctx.translate(canvas1.width / 2, canvas1.height / 2);
//gira el contexto unos 270º
ctx.rotate(3*Math.PI/2);
// dibuja el trazado
ctx.beginPath();
for( var i = 0; i<L; i++ ){
x = X + R * Math.cos( rad*i );
y = Y + R * Math.sin( rad*i );
ctx.lineTo(x, y);
}
ctx.closePath();
ctx.stroke();
ctx.fill();
}
}
}
Recorta una región con la forma y tamaño del trazado dibujado previamente en el
clip() context.clip() canvas. Cualquier cosa dibujada después, será visible solo dentro de la región de <canvas>
recorte ( clipping region ).
Combinar trazados
globalCompositeOperation
Para combinar trazados en el <canvas> podemos utilizar la propiedad globalCompositeOperation. Esta propiedad define la apariencia de nuevos trazados, y como estos
afectan o están afectados por los trazados ya existentes en el <canvas>.
La propiedad globalCompositeOperation puede tomar 12 valores diferentes.
Un poco de inglés
Podemos traducir destination image ( la imagen azul de los ejemplos anteriores ) como imagen de destino y representa la imagen ya existente en el <canvas> cuando
empezamos a dibujar el nuevo trazado.
Por tanto cuando el valor de la propiedad globalCompositeOperation = "destination-over" quiere decir que la imagen de destino, o la imagen existente está encima ( over )
de la nueva imagen.
Podemos traducir source image ( la imagen anaranjada de los ejemplos anteriores ) como imagen de origen oimagen fuente y representa la nueva imagen que dibujaremos
en el <canvas>.
Por tanto cuando el valor de la propiedad globalCompositeOperation = "source-over" quiere decir que la imagen de origen, o la nueva imagen está encima ( over ) de la
imagen de destino.
Valor Descripcion
source-over Valor por defecto. La nueva imagen ( source ) aparece ENCIMA de la imagen existente ( destination ).
Valor Descripcion
La nueva imagen ( source ) aparece solo AL EXTERIOR de la imagen existente ( destination ), mientras que la
source-out
imagen existente vuelve transparente.
source-atop La nueva imagen ( source ) aparece SOLO ENCIMA de la imagen existente ( destination ).
destination-
La imagen existente( destination ) aparece ENCIMA de la nueva imagen ( source ).
over
destination-
La imagen existente( destination ) aparece SOLO ENCIMA de la nueva imagen ( source ).
atop
destination- La imagen existente ( destination ), aparece solo AL EXTERIOR de la nueva imagen ( source ) mientras que la
out nueva imagen vuelve transparente.
copy Solo la nueva imagen ( source ) está visible, mientras que la imagen existente ( destination ), es ignorada.
La nueva imagen ( source ) se combina con la imagen existente ( destination ) utilizando una disyunción
Xor
exclusiva (exclusive or).
Vea la chuleta con las propiedades y metodos() de canvas.
Un ejemplo fácil con "xor"
A continuación superpondremos dos rectángulos que combinaremos con globalCompositeOperation = "xor".
<canvas width= "250" height= "130" id= "lienzo1">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo1");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
var x=80, y=15, w=75, h=75, color = "#0000ff";
var x1=95, y1=40, w1=75, h1=75, color1 = "#ff6400";
ctx.globalCompositeOperation = "xor";
ctx.fillStyle = color;
ctx.fillRect(x,y,w,h);
ctx.fillStyle = color1;
ctx.fillRect(x1,y1,w1,h1);
}
}
}
Otro ejemplo con "destination-out"
En el siguiente ejemplo el <canvas> tiene una imagen de fondo asignada con el CSS. Después de haber dibujado un rectángulo, utilizaremos el
método globalCompositeOperation = "destination-out" para borrar parte de este.
<canvas width= "250" height= "232" id= "lienzo2" style= "background-image:url(images/enfeinada250.jpg)">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo2");
if (canvas1 && canvas1.getContext) {
var ctx1 = canvas1.getContext("2d");
if (ctx1) {
ctx1.beginPath();
ctx1.fillStyle = "#6a50b1";
ctx1.fillRect(50, 40, 150, 120);
ctx1.globalCompositeOperation = "destination-out";
ctx1.fillRect(70, 60, 110, 60);
}
}
}
Semilla de la vida con "xor"
La Semilla de la Vida es el nombre que se da a una figura geométrica compuesta de 6 círculos completes, todos del mismo diámetro, y para algunos tiene un significado
místico y esotérico. Aquí nos interesa solo como dibujarla, ya que nos permite practicar con la propiedad globalCompositeOperation de <canvas>.
Empezaremos esbozando un circulo imaginario con el centro en la esquina superior izquierda del <canvas> (var cX = 0, cY = 0) con un radio de 60px ( var r = 60;). No hay
que trazarlo. Solo servirá de guía.
Trasladaremos el contexto en el centro del canvas: ctx.translate(ctx.canvas.width/2,ctx.canvas.height/2);
Para dibujar la "semilla de la vida" necesitaremos 6 círculos cuyos centros están dispuestos equidistantemente en la circunferencia del circulo guía, o sea formando un
ángulo "a" de 60° entre ellos. Recordemos que en radianes 60° = Math.PI/3.
Observamos que podemos escribir un bucle for para construir los 6 circulos.
Para el centro del primer circulo el ángulo a = (Math.PI/3)*0 radianes.
Para el centro del segundo circulo el ángulo a = (Math.PI/3)*1 radianes.
Para el centro del tercer circulo el ángulo a = (Math.PI/3)*2 radianes.
etc...
Falta encontrar las coordenadas de los centros, y la fórmula ya la conocemos:
X = cX+r*cos(a);
Y = cY+r*sin(a);
donde "a" es el ángulo calculado anteriormente.
Al final dibujaremos los círculos utilizando el método arc(), y los combinaremos a cada uno con el circulo anterior utilizando ctx.globalCompositeOperation = "xor";
Ahora podemos cerrar el bucle for.
<canvas width= "250" height= "260" id= "lienzo">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
var cX = 0;
var cY = 0;
var r = 60;
// definimos el estilo de relleno
ctx.fillStyle = "blue";
// trasladamos el contexto en el centro del canvas
ctx.translate(ctx.canvas.width/2,ctx.canvas.height/2);
// girar 90°
ctx.rotate( Math.PI/2 );
var cX = ctx.canvas.width/2;
var cY = ctx.canvas.height/2;
var r = 70;
// recortamos!!!
ctx.beginPath();
ctx.arc(cX,cY,r,0,2*Math.PI);
ctx.clip();
// cuerpo
ctx.beginPath();
ctx.fillStyle = "#ccc";
ctx.arc(cX,cY,r,0,2*Math.PI);
ctx.fill();
// barriguita
ctx.beginPath();
ctx.fillStyle = "#cc9";
ctx.arc(125,180,r,0,2*Math.PI);
ctx.fill();
// ala
ctx.beginPath();
ctx.fillStyle = "#fcc";
ctx.arc(180,105,r,0,2*Math.PI);
ctx.fill();
// ojo
ctx.beginPath();
ctx.fillStyle = "#000";
ctx.arc(90,90,4,0,2*Math.PI);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = "#eee";
ctx.arc(90,90,2,0,2*Math.PI);
ctx.fill();
}
}
}
Todo parece funcionar muy bien, pero en Google Chrome el borde del cuerpo ( la región de recorte ) aparece pixelado y muy feo ( por culpa del Anti Aliasing ) y NO lo
podemos arreglar con un borde, ya que de esta manera el borde aparecería entre el cuerpo y la colita y las demás cosas.
Dibujar pajarito con "source-atop"
Borramos las líneas de código que definen la región de recorte ( las lineas 34-37 del ejemplo anterior ), y enseguida después de dibujar el cuerpo del pajarito escribimos esta
línea de código:
ctx.globalCompositeOperation = "source-atop";
Utilizando "source-atop" haremos que todos los trazados dibujados después ( source ) sean visibles solo encima del cuerpo del animal ( destination ).
<canvas width= "250" height= "240" id= "lienzo1">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas1 = document.getElementById("lienzo1");
if (canvas1 && canvas1.getContext) {
var ctx1 = canvas1.getContext("2d");
if (ctx1) {
//colita
ctx1.beginPath()
ctx1.fillStyle = "#fcc";
ctx1.moveTo(165, 175);
ctx1.lineTo(210, 168);
ctx1.lineTo(180, 140);
ctx1.fill();
// pico
ctx1.beginPath()
ctx1.fillStyle = "#f90";
ctx1.moveTo(35, 95);
ctx1.lineTo(70, 85);
ctx1.lineTo(57, 110);
ctx1.fill();
//patas
ctx1.beginPath()
ctx1.fillStyle = "#cc9";
ctx1.moveTo(125, 185);
ctx1.lineTo(125, 215);
ctx1.lineTo(140, 180);
ctx1.lineTo(140, 215);
ctx1.lineTo(155, 177);
ctx1.fill();
var cX = ctx1.canvas.width/2;
var cY = ctx1.canvas.height/2;
var r = 70;
// cuerpo
ctx1.beginPath();
ctx1.fillStyle = "#ccc";
ctx1.arc(cX,cY,r,0,2*Math.PI);
ctx1.fill();
fillStyle context.fillStyle=color|gradient|pattern; Determina o devuelve el color, gradiente o patrón del relleno. #000;
fillText() context.fillText(text,x,y,maxWidth); Dibuja texto relleno con un color, gradiente o patrón #000;
JavaScript Descripción Defecto
previamente definido.
maxWidth es opcional. No se admite en Safari.
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | alphabetic
alineación vertical del texto.
ideographic | bottom";
ctx.font="30pt Verdana";
ctx.fillStyle = "blue";
ctx.fillText("fillText",centerX,60);
ctx.font="25pt Verdana";
ctx.strokeStyle="green";
ctx.lineWidth = 2;
ctx.strokeText("strokeText",centerX,120);
}
}
}
Vea la chuleta con las propiedades y metodos() de canvas.
Más información acerca del soporte de canvas en los navegadores
Alineación horizontal
La propiedad textAlign especifica el tipo de alineación del texto. Puede tomar una de las siguientes valores: center( centrar texto ), left ( alinear texto a la
izquierda), right ( alinear texto a la derecha ), start y end.
En idiomas como el castellano, con un sistema de escritura de izquierda a derecha, start == left y end == right, mientras que en idiomas con sistemas de escritura de
derecha a izquierda, como el hebreo, pasa todo lo contrario: start es lo mismo que right y end es lo mismo que left.
JavaScript Descripción Defecto
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | alphabetic
alineación vertical del texto.
ideographic | bottom";
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | alphabetic
alineación vertical del texto.
ideographic | bottom";
Medir texto
El método measureText() devuelve un objeto que contiene la anchura del texto especificado entre paréntesis.
En el siguiente ejemplo utilizaremos el método measureText() para calcular el tamaño de fuente para que el texto escogido quepa en el <canvas>
JavaScript Descripción Defecto
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | alphabetic
alineación vertical del texto.
ideographic | bottom";
Enviar!
Escoge tu cita favorita y haz clic en "Enviar!"
Cambio de línea
En JavaScript el metacarácter \n se utiliza para insertar un salto de línea.
alert("esto inserta un\nsalto de l\355nea")
La mala noticia es que esto no funciona en el <canvas> de html5. La buena noticia es que podemos escribir una función para insertar saltos de línea. Veamos como queda.
Más información acerca del uso de símbolos en javaScript.
<canvas width= "250" height= "165" id= "lienzo">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
var ctx = canvas.getContext("2d");
if (ctx) {
var maxWidth = 190;
var padding = 30;
var maxWidth = canvas.width - 2*padding;
var texto = "El veloz murci\351lago hind\372 com\355a feliz cardillo y kiwi. La cig\374e\361a tocaba el saxof\363n detr\341s del palenque de paja.";
var x = padding;
var y = 50;
var alturaDeLinea = 25;
ctx.font = "12px Arial";
ctx.fillStyle = "#333";
// llama la función ajusteDeTexto
ajusteDeTexto(texto, x, y, maxWidth, alturaDeLinea);
}
}
context.textBaseline =
Determina (sets) o devuelve (returns) la
textBaseline "alphabetic | top | hanging | middle | alphabetic
alineación vertical del texto.
ideographic | bottom";
translate() context.translate(x,y); Mueve el origen (0,0) del <canvas> en un punto dado(x,y). 0,0
ctx.translate(75, 100);
ctx.fillStyle = "red";
ctx.fillRect(0,0,100,50);
}
}
}
Girar con rotate()
El método rotate() gira los trazados posteriores con un ángulo dado (en radianes). El punto alrededor del cual gira coincide con el origen del contexto (0,0). Si queremos que
un trazado gire alrededor de otro punto, tendremos que trasladar el origen del contexto en este punto antes de girar.
A continuación utilizaremos un bucle for ( for loop ) para dibujar una série de rectángulos. Después de cada rectángulo giraremos el contexto 20° (Math.PI/9) en el sentido
del reloj.
Como que las transformaciones son cumulativas, y los rectángulos giran alrededor del origen del contexto, al final tendremos algo parecido a un abanico de rectángulos.
<canvas width= "250" height= "240" id= "lienzo1">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas = document.getElementById("lienzo1");
if (canvas && canvas.getContext) {
var ctx1 = canvas.getContext("2d");
if (ctx1) {
var cw = canvas.width;
var ch = canvas.height;
var w = 100;
var h = 15;
for( var i = 0; i<5; i++ ){
ctx1.fillStyle = "blue";
//dibujamos un rectangulo
ctx1.fillRect((cw-w)/2, 0, w, h);
// giramos 20 grados
ctx1.rotate(Math.PI/9);
}
}
}
}
Cambiar el centro de rotación
Si queremos que un trazado gire alrededor de otro punto (que no sea el la esquina izquierda arriba del <canvas>) tendremos que trasladar el origen del contexto en el
punto deseado.
A continuación trasladamos el origen en el centro del canvas y utilizaremos un bucle for ( for loop ) para dibujar una série de cuadrados. Haremos que los cuadrados sean
transparentes (ctx.globalAlpha=0.4) y azules. Después de dibujar cada cuadrado giraremos el contexto 60º (Math.PI/3) en el sentido del reloj. Veamos como queda.
<canvas width= "250" height= "240" id= "lienzo2">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas2 = document.getElementById("lienzo2");
if (canvas2 && canvas2.getContext) {
var ctx2 = canvas2.getContext("2d");
if (ctx2) {
var cw = canvas2.width;
var ch = canvas2.height;
var w = 50;
var h = 50;
ctx2.fillStyle = "blue";
ctx2.globalAlpha=0.4;
// trasladamos el origen en el centro del canvas
ctx2.translate(cw/2, ch/2);
for( var i = 0; i<6; i++){
// giramos 60 grados
ctx2.rotate(Math.PI/3);
//dibujamos un nuevo rectangulo
ctx2.fillRect(-w,-h,w,h);
ctx2.strokeRect(-w,-h,w,h);
}
}
}
}
Redimensionar con scale()
El método scale(h,v) reduce o amplía a escala el dibujo actual, donde h representa la escala horizontal, y v la escala vertical. Por ejemplo: si h = 0.5 la altura se verá reducida
a un 50%. Si por el contrario v = 2, la anchura aumentara a 200% de su valor inicial. Veamos un ejemplo.
<canvas width= "250" height= "100" id= "lienzo3">Su navegador no soporta canvas :( </canvas>
window.onload = function() {
var canvas3 = document.getElementById("lienzo3");
if (canvas3 && canvas3.getContext) {
var ctx3 = canvas3.getContext("2d");
if (ctx3) {
ctx3.fillStyle = "#f00";
ctx3.lineWidth=5;
// dibuja el rectángulo pequeño
ctx3.strokeRect(12,15,25,15);
ctx3.fillRect(12,15,25,15);
// redimensiona
ctx3.scale(5,2.5);
// el mismo código que dibujó el rectángulo pequeño
// dibuja ahora el rectángulo grande
ctx3.strokeRect(12,15,25,15);
ctx3.fillRect(12,15,25,15);
}
}
}
Transformaciones a medida
Además de mover con tanslate(), redimensionar con scale() y girar con rotate(), el <canvas> de HTML5 dispone de dos métodos que nos permiten hacer transformaciones a
medida: transform() y setTransform().
Método JavaScript Descripción Defecto
translate() context.translate(x,y); Mueve el origen (0,0) del <canvas> en un punto dado(x,y). 0,0
Manipular imágenes
El <canvas> nos permite modificar, uno por uno, los píxeles de una imagen. Para esto tenemos a nuestra disposición tres propiedades y tres métodos() de <canvas>
Importante: si queremos experimentar manipulando imágenes en el <canvas> tenemos que hacerlo en un sitio web de verdad, como por ejemplo locahost.
JavaScript Descripción Defecto
Los píxeles de una imagen "en crudo" tienen una "anchura" de 4 bytes, uno por cada componente R G B A. (Red (rojo), Green (verde), Blue (azul) y Alpha). Accediendo uno
por uno los pixeles de una imagen podemos modificar estos componentes de color, y por tanto manipular el aspecto de las imágenes en el<canvas>.
Ojo: por razones de seguridad el <script> que manipulará estos bytes tiene que provenir de la misma página web. De otra manera el acceso al <script> será denegado y el
navegador levantará una excepción de seguridad.
Un ejemplo fácil
A continuación dibujaremos un cuadrado. Ya lo se, sería mucho más fácil dibujarlo con fillRect(), pero es solo para demonstrar como podemos dibujar una imagen sencilla
partiendo prácticamente desde cero.
1. El método createImageData(anchura , altura) crea un nuevo objeto ImageData en blanco, de anchura y altura dadas.
2. En el siguiente paso iremos de pixel en pixel modificando uno por uno el valor de los componentes RGBA.
Como ya hemos visto cada pixel tiene una "anchura" de 4 bytes, donde el primer byte representa el rojo, el segundo representa el verde, el tercero el azul y el
cuarto es el componente alpha o el grado de transparencia.
Siendo bytes pueden tomar valores entre 0 y 255.
En el siguiente ejemplo manipularemos cada pixel para que:
en píxeles