Crear una app de dibujo simple utilizando HTML 5 Canvas

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;
       }

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.