Quantcast

Camera Preview Ionic - Otro uso para la cámara

Aitor Sánchez - Blog - Oct. 31, 2023, 1:25 p.m.

¿Necesitas que tu usuario tenga una preview de la cámara desde dentro de tu aplicación? O, quizás ya sabes cómo se hace, pero aún te falta conocer algún detallito más para terminar de hacerlo funcionar ¿cierto?

Mi nombre es Aitor Sánchez, soy desarrollador de apps desde 2014, y en este artículo aprenderás, de manera sencilla y accionable, cómo hacer que tu usuario vea una vista previa de lo que está enfocando la cámara de su dispositivo desde dentro de tu app. Y todo esto, con el componente Camera Preview de Ionic.

Pero antes de continuar, esta es la Flutter Mafia. Es mi newsletter donde tu vas a aprender a hacer apps y a ganar dinero con ellas junto con otros genietes que ya están dentro. Y si te suscribes te regalo mi ebook "Duplica los ingreso de tus apps en 5 minutos" No es broma, quizás te interese.

Y ahora si, comenzamos. Let´s go!
 

Instalación de Camera Preview para Ionic

Cómo todos los componentes desacoplados del core del sistema, necesitamos instalarlo en nuestra app para poderlo usar. Para ello vamos a usar las dos siguientes líneas de código:

$ ionic cordova plugin add cordova-plugin-camera-preview
$ npm install @ionic-native/camera-preview

 

La primera instalará el plugin que permitirá la comunicación con la parte nativa del dispositivo donde se esté ejecutando la app.

La segunda instalará el código TS que hará de puente entre el nuestro código de la aplicación y el plugin.

 

Configuración del módulo

En el caso de que no esté utilizando Ionic 4 o superior con el módulo NGX de Camera Preview Ionic, será necesario que agregues el componente a los providers de tu componente de la siguiente manera:

providers: [

…,

CameraPreview,

…

]

 

Recuerda, si nos vas a usar el módulo en toda la app, es mucho mejor ponerlo en los providers del componente que lo vaya a usar. Así estarás incurriendo en buenas prácticas y en rendimiento para tu app.

 

Plataformas soportadas por Campera Preview

Bueno, cómo era de esperar, y con Windows Phone fuera de juego, estas son las siguientes plataformas para las que estará disponible:

  • Android
  • iOS

 

Ejemplo de uso de Campera Preview en Ionic

Bien, este ejemplo va a ser un poco más largo de lo que acostumbramos. Pero no por ello nos vamos a achantar ¿verdad? Eso, al lío. Pero primero un ejemplo de código, cómo siempre.

import { CameraPreview, CameraPreviewPictureOptions, CameraPreviewOptions, CameraPreviewDimensions } from '@ionic-native/camera-preview/ngx';

constructor(private cameraPreview: CameraPreview) { }

...

// camera options (Size and location). In the following example, the preview uses the rear camera and display the preview in the back of the webview
const cameraPreviewOpts: CameraPreviewOptions = {
  x: 0,
  y: 0,
  width: window.screen.width,
  height: window.screen.height,
  camera: 'rear',
  tapPhoto: true,
  previewDrag: true,
  toBack: true,
  alpha: 1
}

// start camera
this.cameraPreview.startCamera(cameraPreviewOpts).then(
  (res) => {
    console.log(res)
  },
  (err) => {
    console.log(err)
  });

// Set the handler to run every time we take a picture
this.cameraPreview.setOnPictureTakenHandler().subscribe((result) => {
  console.log(result);
  // do something with the result
});


// picture options
const pictureOpts: CameraPreviewPictureOptions = {
  width: 1280,
  height: 1280,
  quality: 85
}

// take a picture
this.cameraPreview.takePicture(this.pictureOpts).then((imageData) => {
  this.picture = 'data:image/jpeg;base64,' + imageData;
}, (err) => {
  console.log(err);
  this.picture = 'assets/img/test.jpg';
});

// take a snap shot
this.cameraPreview.takeSnapshot(this.pictureOpts).then((imageData) => {
  this.picture = 'data:image/jpeg;base64,' + imageData;
}, (err) => {
  console.log(err);
  this.picture = 'assets/img/test.jpg';
});


// Switch camera
this.cameraPreview.switchCamera();

// set color effect to negative
this.cameraPreview.setColorEffect('negative');

// Stop the camera preview
this.cameraPreview.stopCamera();

 

En primer lugar, y a diferencia de la mayoría de ocasiones, vamos a hacer uso de las siguientes clases para completar el ejemplo:

  • CameraPreview
  • CameraPreviewPictureOptions
  • CameraPreviewOptions
  • CameraPreviewDimensions

Estas clases pertenecen al módulo que acabamos de instalar en pasos anteriores y que hemos añadido a los providers de la app. El módulo es el: @ionic-native/camera-preview/ngx.

Posteriormente, inyectaremos una instancia de la clase a través del constructor de la clase en la que estemos trabajando.

De manera explícita, crearemos una instancia de la interface CameraPreviewOptions con los datos que hemos dado en el ejemplo.

Ahora, para poner la cámara en marcha, usaremos “startCamera”. El componente ya se ocupará por debajo de solicitar los permisos y demás cosas por debajo. Así nos ahorra trabajo.

Dicho método, startCamera, recibe la instancia de CameraPreviewOptions que hemos creado antes y al ser una promesa la tendremos que controlar para que todo funcione.

Pues con esto, ya tendríamos la cámara en pantalla y podríamos ver que se ve a través de ella. Ahora vamos a terminar de comentar el ejemplo.

Crearemos una instancia de la interfaz “CameraPreviewPictureOptions” con los datos dados en el ejemplo.

Esta instancia será usada para, por ejemplo, tomar una foto con los métodos que vemos en el ejemplo “takePicture” y “takeSnashot”. No estoy del todo seguro, pero creo que sirven para lo mismo. Yo he probado ambos y no veo la diferencia de uno a otro.

El resto de los métodos que podemos ver en el ejemplo, los detallaré con más profundidad ahora, así que no será necesario que los especifique aquí.

Pues este ha sido el ejemplo, cómo he comentado más arriba, es un poco más tortuoso que el resto de las componentes que hemos visto. Pero bueno, este mundillo es así, algunas veces se complican las cosas de más. Sigamos.

 

Funciones y métodos de Cámera Preview Ionic

Vamos a pasar a ver las funciones y los métodos que tenemos disponibles en camera preview Ionic para sacar el máximo partido al módulo que Ionic pone a nuestra disposición para tal fin.

 

starCamera(options)

  • Parámetros:
    • options: CameraPreviewOptions -> Serán las opciones con las que queremos que arranque la vista previa de dicha cámara. Todos los campos los veremos más abajo en este tutorial.
  • Retorna una promesa que tendremos que controlar. En el momento que todo esté listo se resolverá y la cámara ya se verá en nuestra pantalla.

Básicamente, esta función inicializa la cámara con las opciones que le hemos pasado por parámetros.

 

stopCamera()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. En caso de que se resuelva, la cámara habrá dejado de mostrarse.

Es lo contrario de la función anterior. Esta hará que la cámara deje de mostrarse en caso de que se esté mostrando. En caso de que no se esté mostrando, no hará nada.

 

switchCamera()

  • No recibe parámetros.
  • Retorna una promesa que hay que controlar.

Con esta función podremos cambiar entre las cámaras de las que disponga el dispositivo donde estamos ejecutando la aplicación. En caso de que solo tenga una, esta función no hará nada.

 

hide()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar.

Cómo su propio nombre indica, esconde la vista de la cámara. Esta función no detiene la ejecución de la cámara, solamente la esconde para que luego la podamos volver a mostrar sin la necesidad de cargar todo el sistema desde 0.

 

show()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar.

Al contrario que la anterior, esta función muestra la cámara en caso de que esta este escondida con la función “hide()”. En caso de no estar escondida, esta no hará nada.

 

takePicture(options)

  • Parámetros:
    • options: CamperaPreviewPictureOptions -> Será una instancia de dicha clase que contiene las opciones con las que queremos que el sistema tome la imagen. Más abajo especificaremos todos sus campos.
  • Retorna una promesa que tendremos que controlar. Dentro de esta llegarán los datos cómo una cadena en base 64 con la imagen.

Esta función, cómo su nombre indica, tomará una foto de la preview que tenemos en pantalla en ese mismo momento. Los datos llegarán cómo una cadena en Base 64, ojo con esto, por que no es la ruta temporal, ni definitiva, de la imagen.

En caso de que queramos guardarla, lo tendremos que hacer de forma explícita. Tendremos que usar la clase File para poder persistirla. Lo explicaré más adelante en el curso. Continuemos con el artículo de Camera Preview.

 

setColorEffect(effect)

  • Parámetros:
    • effect: string -> Será el efecto que queremos darle a la preview, y posteriormente a la imagen. Podemos elegir entre los siguientes:
      • none -> No tendrá efecto.
      • aqua -> Solo disponible para Android
      • blackboard -> Solo disponible para Android
      • mono -> Disponible para Android e iOS
      • negative -> Disponible para Android e iOS.
      • posterize -> Disponible para Android e iOS.
      • sepia -> Disponible para Android e iOS.
      • solarize -> Solo disponible para Android.
      • whiteboard -> Solo disponible para Android.
    • Retorna una promesa que tendremos que controlar. En caso de que se resuelva, el efecto ha sido aplicado correctamente.

Dicha función, aplica el efecto que nosotros queramos a la preview que esté en el dispositivo y posteriormente a la imagen que capturemos.

 

setZoom(zoomCuantity)

  • Parámetros:
    • zoomCuantity: number -> Será la cantidad de zoom que queremos aplicarle a la preview.
  • Retorna una promesa que tendremos que controlar para saber si todo ha ido bien.

Esta función nos permite definir una cantidad de zoom que queremos que tenga la camera preview y posteriormente la imagen. No puede ser mayor que el máximo zoom permitido por el dispositivo, ni menos de 0.El siguiente métodos aclararán tu pregunta.

 

getMaxZoom()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. Con ella llegarán los datos de cuanto es el zoom máximo al que podemos llevar la cámara del dispositivo.

Cómo he explicado en el retorno, nos permite conocer cuál es el número máximo de aumentos que le podemos poner al zoom. Dependiendo de la calidad de la cámara y del dispositivo en sí mismo.

 

getZoom()

  • No recibe parámetros.
  • Retorna una promesa que hay que controlar. Con ella llegarán los datos de cuál es el zoom actual que tiene seteado el sistema.

Nos permite conocer cuál es el zoom actual que porta la cámara del sistema.

 

setPreviewSize(dimensions)

  • Parámetros:
    • dimensions: CameraPreviewDimensions -> Serán las nuevas dimensiones de la vista previa de la cámara. Veremos los campos de esta clase más abajo.
  • Retorna una promesa que tendremos que controlar. En caso de que se resuelva, es que todo ha ido bien.

Nos permite, después de inicializar la camera preview desde startPreview(), setearle una dimensiones diferentes.

 

setFocusMode(focusMode)

  • Parámetros:
    • focusMode: string -> Será el tipo de enfoque que queremos que tenga el sistema (Los podemos sacar de CameraPreview.FOCUS_MODE). Podemos elegir uno entre los siguientes:
      • fixed -> Siempre será el mismo.
      • auto -> Enfocará de manera oportuna, cuando el sistema crea que es momento.
      • continuous-picture -> Enfoca constantemente sobre la imagen.
      • continuous-video -> Similar al anterior, pero sobre lo que se ve en la preview.
      • edof
      • infinity
      • macro
    • Retorna una promesa que tendremos que controlar. Si todo ha ido bien, esta se resolverá.

Nos permite definir qué tipo de enfoque queremos que capte nuestro objetivo sobre lo que estamos haciendo, o queremos hacer.

 

getFocusMode()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. Dentro de ella llegará la información de cuál es el modo de enfoque que está seteado.

Retorna el método de enfoque que tiene en ese momento el componente seteado.

 

getSupportedFocusModes()

  • No recibe parámetros.
  • Nos retorna una promesa que se resolverá en caso de que todo haya ido bien. Dentro de ella llegarán los datos de los modos de enfoque que tenemos disponibles.

Nos permite saber cuáles son los métodos de enfoque que tenemos disponibles en el dispositivo donde se esté ejecutando la aplicación. Muy útil para evitar problemas de seguridad.

 

setFlashMode(flashMode)

  • Parámetros:
    • flashMode: string -> Será el modo con el que queramos que se comporte el flash de la cámara (Los podremos sacar de CameraPreview.FLASH_MODE). Tenemos los siguientes disponibles.
      • off
      • on
      • auto
      • torch
    • Retorna una promesa que tendremos que controlar. En caso de que se resuelva es que todo ha ido bien.

Nos permite definir de qué manera queremos que se comporte el flash en ese mismo momento. Muy útil, por ejemplo, para aplicaciones cómo lectores de tarjetas, códigos QR, etc…

 

getFlashMode()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. En ella llegará el modo que estamos utilizando en ese instante para el flash.

Nos permite saber qué modo de flash está utilizando en ese momento la cámara del dispositivo.

 

getSupportedFlashModes()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. Con ella llegará el array con los datos de los modos que tenemos disponibles.

Esta función nos permite conocer cuáles son los modos de flash que el dispositivo en cuestión tiene para usar.

 

getSupportedPictureSizes()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. Con ella llegarán los datos de los tamaños.

Esta función nos permitirá conocer cuáles son los tamaños máximos soportados por el dispositivo donde estamos corriendo la aplicación.

 

setExposureMode(lock)

  • Parámetros:
    • lock: string -> Será el modo de exposición que podemos definir en el sistema. Tenemos los siguientes para elegir (los podremos sacar de CameraPreview.EXPOSURE_MODE):
      • auto -> Solo iOS
      • continuous -> iOS y Android
      • custom -> iOS y Android
      • lock -> Solo iOS
    • Retorna una promesa que tendremos que controlar. Si se resuelve es que todo ha ido bien.

Básicamente, nos permite controlar el tipo de exposición que queremos que tenga el objetivo de nuestra cámara en la vista previa.

 

getExposureMode()

  • No recibe parámetros.
  • Retorna una promesa que tendremos que controlar. Con ella llegarán los datos de modo que está activo en ese instante.

Básicamente, nos permite acceder al modo de exposición que hay actualmente seteado en el sistema.

 

getExposureModes()

  • No recibe parámetros.
  • Retornará una promesa que se resolverá si todo ha ido bien. En ella llegarán los modos de exposición que tenemos disponibles.

Esta función nos permite conocer los modos de exposición que tenemos disponibles en la cámara del dispositivo donde estamos ejecutando la app.

 

setExposureCompensation(exposureCompensation)

  • Parámetros:
    • exposureCompensation: number -> Será el número, entre 0 y 100, que queremos aplicar al filtro de exposición.
  • Retornará una promesa que tendremos que controlar. En caso de que todo haya ido bien se resolverá.

Básicamente, nos permite definir la cantidad de exposición sobre la imagen que tenemos en ese mismo instante. Esta función solo estará disponible para Android.

 

getExposureCompensation()

  • No recibe parámetros.
  • Retornará una promesa que tendremos que controlar. En caso de que se resuelva es que todo ha ido bien y en ella llegará la cantidad de exposición que estamos aplicando a la cámara.

Nos permitirá acceder a la cantidad de exposición que estamos poniendo sobre la cámara. Esta función solo estará disponible para Android.

 

getExposureCompensationRange()

  • No recibe parámetros.
  • Retorna una promesa que hay que controlar. En ella llegará el rango de compensación sobre la exposición general que está aplicada.

Básicamente, nos permite acceder al rango de compensación de la exposición que tenemos aplicada en el sistema. Solo estará disponible para Android.

 

tapToFocus(xPoint, yPoint)

  • Parámetros:
    • xPoint: string -> Será el punto en el eje X sobre el que queremos enfocar.
    • yPoint: string -> Será el punto en el eje Y sobre el que queremos enfocar.
  • Retorna una promesa que tienes que controlar. Se resolverá cuando haya terminado de realizar el enfoque sobre el punto dado.

Nos permite definir sobre que punto queremos enfocar el objetivo de la cámara.

 

onBackButton()

  • No recibe parámetros.
  • Retorna una promesa que hay que controlar. Se resolverá cuando se pulse sobre el botón “atrás” cuando la cámara está abierta.

Básicamente, es un listener que nos permitirá saber cuándo un usuario ha pulsado sobre el botón de atrás, o back, cuando la cámara se está mostrando o está oculta con la función “hide”.

 

Pues bien, hemos llegado al final de la lista de funciones que tenemos disponibles para usar. Ahora vamos a explicar los campos del componente y las interfaces que lo acompañan.

 

Campos e Interfaces de Camera Preview Ionic

Todos estos campos e interfaces, los hemos visto a lo largo del artículo. Pero ahora vamos a los atributos que contienen y una breve descripción para comenzar a usar más profundamente Camera Preview Ionic

 

CameraPreviewOptions

  • x: number -> Será el eje X DESDE DONDE comenzará a mostrarse la vista de la cámara. Por defecto: 0.
  • y: number -> Será el eje Y DESDE DONDE comenzará a mostrarse la vista de la cámara. Por defecto: 0.
  • width: number -> El tamaño, en píxeles, del ancho de la vista de la cámara.
  • height: number -> El tamaño, en píxeles, del alto de la vista de la cámara.
  • camera: string (opcional) -> Será la cámara que vamos a utilizar, los posibles son: “front” o “near”. Por defecto, front.
  • tapPhoto: boolean (opcional) -> Si es verdadero, al tocar en la pantalla se tomará una foto. Por defecto:
  • previewDrag: boolean (opcional)
  • toBack: boolean (opcional)
  • alpha: number -> Será el canal Alpha de la vista de la cámara. Será un flotante entre 0 y 1 donde 0 es totalmente opaco y 1 totalmente transparente.
  • tapToFocus: boolean (opcional) -> Si es verdadero, al hacer un tap en la pantalla este hará focus donde se ha realizado el tap. Damos por hecho que la cámara está a pantalla completa. Por defecto, falso.
  • disableExifHeaderStripping: boolean (opcional) -> Si es verdadera, no rotará la imagen y eliminará datos de la cabecera de esta. Por defecto: false.

 

CameraPreviewPictureOptions

  • width: number -> El ancho de la imagen en pixeles. Por defecto, 0.
  • height: number -> El alto de la imagen en pixeles. Por defecto, 0.
  • quality: number -> Será la calidad de la imagen. El valor va entre 0 y 100 y por defecto es 85.

 

CameraPreviewDimensions

  • width: number -> Será el ancho, en píxeles, que le vamos a dar a la vista de la preview.
  • height: number -> Será el alto, en píxeles, que le vamos a dar a la vista de la preview.

 

Pues esto ha sido todo por hoy lector sobre camera preview Ionic. Menudo pedazo de charla de pesadilla. Madre mía… Pero bueno, ya hemos terminado.

 

Tutorial en video por si no te gusta leer

 

Algo más que quizás te interesa

Hemos montado esta herramienta para que evalues, optimices y mejores los iconos de tus aplicaciones. Que, cómo ya deberías de saber, una estrategia para mejorar la calidad del logo afecta directamente a sus descargas y a tus ingresos de manera directa.

Así que no te espoileo nada, entra al enlace.

 

Y hasta aquí el artículo de hoy. Espero haberte ayudado y nos vemos en el siguiente. Hasta entonces ¡que vaya bien!

Otros artículos que te pueden interesar

Mixpanel Ionic | Aprende cómo se usa aquí

¿Pensando en integrar tu aplicación en la consola de Mixpanel y estás cansad...

In App Purchases Ionic - Recibe pagos en tu app

¿Necesitas incluir compras dentro de la aplicación y has pensado en el componente I...

Sms Ionic | Cómo enviar mensajes de texto desde...

¿Necesitas qué tus usuarios envíen sms desde dentro de tu aplicación?...

Stripe Ionic | Cómo realiza cobros desde tu apl...

¿Buscando la manera de aceptar pagos en tu aplicación mediante Stripe? O, quiz&aacu...

Ionic Toast | Comunícate con tu usuario con est...

¿Buscando una manera de comunicarte con tus usuarios y has optado por un Toast en Ionic? O...

Ionic Bluetooth | Qué es y cómo tu puedes utili...

¿Quieres envair y recibir información con otro dispositivo desde tu app hecha en Io...

Navigation Ionic y su Navcontroller

¿Buscando información sobre NavController, o navigation, del framework Ionic? O, qu...

Ion Select | todo lo que debes saber está aquí

¿Necesitas que tu usuario seleccione un valor de una lista y has pensado en ion-select? O,...