En mi blog he hecho varios posts sobre tomar fotos con la cámara web desde JavaScript, para enviarlas a PHP; pero nunca he hecho un ejemplo sin usar PHP.
Es por ello que hoy voy a explicar cómo tomar una foto de la cámara web (igualmente de la cámara trasera o delantera en los dispositivos compatibles) y guardarla o descargarla directamente como archivo, sin usar código del servidor.
El código para tomar la foto funciona en varios dispositivos con un navegador actualizado, desde teléfonos y tabletas Android, iPads y más.
Para probar la app accede a este enlace, y para ver el código fuente completo (ya que a través del post explicaré los detalles más importantes únicamente) mira el repositorio en Github.
Recuerda que para alojarla debes usar un servidor con https o localhost.
Me he esforzado en hacer el código HTML lo más corto posible. En resumen solamente necesitamos un elemento <video> para mostrar el stream y un canvas (que mantenemos oculto, y que podría ser creado dinámicamente).
Eso es todo el código de la vista, es momento de ver el código JavaScript.
Para tomar la foto usamos la API de JavaScript llamada getUserMedia
, la cual está disponible desde hace bastante tiempo y si bien no está estandarizada, varios navegadores ofrecen soporte para la misma.
Para pedir permisos llamamos a getUserMedia
pasándole 3 argumentos:
Dentro de la función de éxito será pasado un argumento que es el stream obtenido, el cual ponemos sobre un vídeo (sí, un elemento <video>
) y reproducimos; de esta manera el usuario estará viendo un vídeo que tiene como fuente su cámara.
Esta API también ofrece una manera de obtener la lista de dispositivos existentes, de esta manera podemos intercambiar entre la cámara frontal y trasera (o más cámaras en caso de que existan).
La lista tiene, entre otras cosas, un deviceId. Ese deviceId se pasa a getUserMedia
y se devolverá el stream adecuado.
Casi lo olvido: para obtener la lista se llama a la función navigator.mediaDevices.enumerateDevices
.
Después de obtener la lista, los dispositivos se ponen en un elemento de tipo select
. En el cambio del mismo se vuelve a obtener el stream (después de detener los demás) y se monta sobre el vídeo.
Con lo que llevamos hasta ahora tenemos un select
que permite intercambiar entre distintas cámaras, además de mostrar el vídeo en un elemento <video>
; lo que sigue es usar un elemento <canvas>
o lienzo para tomar la foto.
El proceso es sencillo. Se pausa el vídeo y se dibuja la imagen que tiene sobre el canvas; una vez hecho eso podemos obtener la imagen como base 64, y cuando la tenemos en ese formato solo resta descargarla creando un enlace.
En este ejemplo tomamos una foto con la cámara web y descargamos la imagen; si quieres ver cómo enviarla a PHP mira este ejemplo.
Los usos que puedes darle al consumo de estas APIs son muchísimos, una vez que ya tienes la foto puedes mostrarla en un elemento <img>
, procesarla o cualquier cosa que tu app requiera.
El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…
En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…
Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…
Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…
En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…
En este artículo se presenta una guía para imprimir un PDF a partir de una…
Esta web usa cookies.
Ver comentarios
Buenas!
Cuando pruebo el mismo codigo html y codigo javascript desde mi sitio web local mi navegador no encuentra ninguno de los dispositivos de camara en navigator de javascript, que podria faltarme?
Pueden ser varios factores. Recuerde que se necesita estar en localhost o un sitio con https para acceder a los dispositivos, así como dar permiso de acceso a la cámara.
Si tiene más dudas estoy para servirle en https://parzibyte.me/#contacto
Me marca el error
Uncaught TypeError: navigator.mediaDevices is not a function
at camara.js:64
at camara.js:159
Ah. Yo lo acabo de probar y funciona como un encanto.
Saludos!
No logro hacer que la foto que se tomo se descargue en otra carpeta diferente a la de descargas, agradecería tu ayuda, gracias de antemano
Con gusto lo atiendo en https://parzibyte.me#contacto
Saludos!
Gracias por la web. Excelente!! Si quisiera ponerle un marco a la cámara antes de hacer la foto, se podría hacer? cómo?
Podrías agregar estilos CSS al elemento canvas. Saludos :)