En este tutorial te vamos a explicar los pasos simples para construir una app de dibujo utilizando puro JavaScript y HTML5 Canvas. También es útil para todos los que quieran aprender a crear una aplicación de dibujo basada en JavaScript.
HTML5 Canvas
El elemento canvas de HTML5 se utiliza para dibujar gráficos a través de secuencias de comandos (normalmente JavaScript). El elemento canvas es solamente un contenedor para los gráficos. Debe utilizar un script para dibujar los gráficos y mostrarlos.
Canvas cuenta con varios métodos para dibujar paths, cajas, círculos, textos y agregar imágenes. Así que, en este tutorial, he utilizado FabricJS como librería externa de canvas y he escrito algunas funciones JS para manejar diferentes características.
Crea tu app de dibujo
Vamos a apuntar a las características con las que va a contar tu aplicación de dibujo:
- Dibujar un rectángulo
- Dibujar un círculo
- Dibujar de una imagen
- Activar y desactivar el dibujo
- Acercar zoom
- Disminuir zoom
- Restablecer zoom
Y necesitas las siguientes herramientas:
- Un archivo HTML
- Un archivo JavaScript
- Una librería para canvas - Fabric.js
PASO 1
Crea los archivos siguientes en el directorio de aplicación:
- index.html
- main.js [o cualquier otro nombre]
PASO 2
Importa la librería FabricJS
PASO 3
Importa una imagen
La estructura de la aplicación debe ser similar a lo que ves a continuación:
App de dibujo
- index.html
- main.js
- miimagen.jpg
- fabric.js
Canvas y FabricJS
Consulta los enlaces de más abajo para saber más acerca de HTML 5 Canvas y la librería FabricJS:
El código
PASO 1
Carga la imagen en el canvas:
var src = 'rutaimagen'; var canvas = new fabric.Canvas('canvas', { isDrawingMode: false }); fabric.Image.fromURL(src, function (oImg) { canvas.add(oImg); });
PASO 2
Añade las funciones necesarias para dibujar objetos:
Dibujar un círculo
var onSolidCircle = function () { canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 150, left: 150 })); }
Dibujar un rectángulo
var rect = new fabric.Rect({ top: 100, left: 100, width: 60, height: 70, fill: '', selection: false, fill: '#f55' }); canvas.add(rect);
PASO 3
Empezar y terminar de dibujar.
Necesitamos dos funciones que nos permitan indicarle al canvas cuándo comenzar a dibujar y cuándo dejar de dibujar.
var onStartDrawing = function () { canvas.isDrawingMode = true; } var onStopDrawing = function () { canvas.isDrawingMode = false; }
PASO 4
Añadir funciones Zoom in y Zoom out.
El Zoom in y zoom out son hoy en día una característica muy básica en cualquier herramienta de dibujo de cualquier plataforma. Canvas necesita dos variables para controlar el zoom:
var canvasScale = 1; var SCALE_FACTOR = 1.2;
Zoom in
var onZoomIn = function () { canvasScale = canvasScale * SCALE_FACTOR; canvas.setHeight(canvas.getHeight() * SCALE_FACTOR); canvas.setWidth(canvas.getWidth() * SCALE_FACTOR); var objects = canvas.getObjects(); for (var i in objects) { var scaleX = objects[i].scaleX; var scaleY = objects[i].scaleY; var left = objects[i].left; var top = objects[i].top; var tempScaleX = scaleX * SCALE_FACTOR; var tempScaleY = scaleY * SCALE_FACTOR; var tempLeft = left * SCALE_FACTOR; var tempTop = top * SCALE_FACTOR; objects[i].scaleX = tempScaleX; objects[i].scaleY = tempScaleY; objects[i].left = tempLeft; objects[i].top = tempTop; objects[i].setCoords(); } canvas.renderAll(); }
Zoom out
var onZoomOut = function () { canvasScale = canvasScale / SCALE_FACTOR; canvas.setHeight(canvas.getHeight() * (1 / SCALE_FACTOR)); canvas.setWidth(canvas.getWidth() * (1 / SCALE_FACTOR)); var objects = canvas.getObjects(); for (var i in objects) { var scaleX = objects[i].scaleX; var scaleY = objects[i].scaleY; var left = objects[i].left; var top = objects[i].top; var tempScaleX = scaleX * (1 / SCALE_FACTOR); var tempScaleY = scaleY * (1 / SCALE_FACTOR); var tempLeft = left * (1 / SCALE_FACTOR); var tempTop = top * (1 / SCALE_FACTOR); objects[i].scaleX = tempScaleX; objects[i].scaleY = tempScaleY; objects[i].left = tempLeft; objects[i].top = tempTop; objects[i].setCoords(); } canvas.renderAll(); }
Resetear Zoom
var onResetZoom = function () { canvas.setHeight(canvas.getHeight() * (1 / canvasScale)); canvas.setWidth(canvas.getWidth() * (1 / canvasScale)); var objects = canvas.getObjects(); for (var i in objects) { var scaleX = objects[i].scaleX; var scaleY = objects[i].scaleY; var left = objects[i].left; var top = objects[i].top; var tempScaleX = scaleX * (1 / canvasScale); var tempScaleY = scaleY * (1 / canvasScale); var tempLeft = left * (1 / canvasScale); var tempTop = top * (1 / canvasScale); objects[i].scaleX = tempScaleX; objects[i].scaleY = tempScaleY; objects[i].left = tempLeft; objects[i].top = tempTop; objects[i].setCoords(); } canvas.renderAll(); canvasScale = 1; }