Components

CameraCapture

Componente per catturare foto dalla fotocamera del dispositivo o da upload file, con output in formato base64.

Panoramica

CameraCapture consente di acquisire immagini tramite la fotocamera del dispositivo (anteriore o posteriore) oppure tramite upload da file. L'output è un data URL base64 dell'immagine catturata, pronto per il salvataggio o la visualizzazione.

Caratteristiche principali:

  • Streaming video in tempo reale prima della cattura
  • Cambio fotocamera (anteriore/posteriore) durante lo streaming
  • Upload da file come alternativa alla fotocamera
  • Anteprima immagine catturata con opzioni ritatta/elimina
  • Formato output configurabile (JPEG, PNG, WebP)
  • Qualità immagine e dimensioni configurabili

Requisiti browser:

  • Supporto getUserMedia API
  • Permesso accesso fotocamera
  • Contesto sicuro (HTTPS)

Casi d'uso tipici: foto documento identità, selfie per profilo utente, scansione documenti, cattura prove visive.

Anteprima live

Il preview mostra l'UI del componente con i pulsanti "Avvia/Ferma fotocamera" e l'opzione upload file. L'attivazione effettiva dello stream richiede HTTPS e il permesso utente — il comportamento dipende dall'ambiente di esecuzione.

Utilizzo nello schema

const schema = [{
  name: 'fotoDocumento',
  type: 'camera',
  label: 'Foto documento',
  props: {
    width: 1280,
    height: 720,
    facingMode: 'environment',
    imageFormat: 'image/jpeg',
    imageQuality: 0.9,
    showPreview: true,
  }
}, {
  name: 'fotoSelfie',
  type: 'camera',
  label: 'Foto profilo',
  props: {
    width: 640,
    height: 640,
    facingMode: 'user',
    imageFormat: 'image/jpeg',
    imageQuality: 0.85,
    helperText: 'Posiziona il viso al centro',
  }
}]

Utilizzo diretto

Cattura documento (fotocamera posteriore)

<CameraCapture
  v-model="frenteDocumento"
  :width="1280"
  :height="720"
  facing-mode="environment"
  image-format="image/png"
  :image-quality="1"
  label="Foto fronte documento"
  helper-text="Posiziona il documento nel riquadro"
/>

Gestione del valore base64

Props

PropTipoDefaultDescrizione
modelValuestring | nullnullData URL base64 immagine catturata (v-model)
labelstringEtichetta del campo
helperTextstringTesto di supporto sotto il campo
errorstringMessaggio di errore (attiva stato invalid)
disabledbooleanfalseDisabilita il campo
invalidbooleanfalseAttiva visivamente lo stato di errore
widthnumber640Larghezza ideale cattura in pixel
heightnumber480Altezza ideale cattura in pixel
facingMode'user' | 'environment''environment'Fotocamera da usare (user=anteriore, environment=posteriore)
imageFormat'image/jpeg' | 'image/png' | 'image/webp''image/jpeg'Formato immagine output
imageQualitynumber0.9Qualità compressione (0.0–1.0, solo per JPEG/WebP)
showPreviewbooleantrueMostra anteprima dell'immagine dopo la cattura
inputPropsRecord<string, unknown>{}Props aggiuntive per il contenitore

Metodi disponibili nell'interfaccia utente

Dopo la cattura, l'utente vede i pulsanti:

  • Ritatta — riavvia la fotocamera per una nuova cattura
  • Elimina — cancella l'immagine e resetta il valore

Durante lo streaming:

  • Scatta — acquisisce il frame corrente
  • Cambia fotocamera — alterna anteriore/posteriore
  • Annulla — ferma lo streaming

Flusso stati interni

Stato iniziale
  └─ [Click "Scatta foto"]
       └─ Richiesta permesso fotocamera
            ├─ [Permesso negato] → Errore + messaggio
            └─ [Permesso concesso] → Streaming attivo
                 ├─ [Click "Scatta"] → Cattura → Anteprima
                 └─ [Click "Annulla"] → Stato iniziale

Slot per upload file

Oltre alla fotocamera, il componente offre nativamente il pulsante "Carica immagine" che apre un file picker con filtro accept="image/*.

Eventi

EventoPayloadDescrizione
update:modelValuestring | nullData URL base64 aggiornato
capturestringEmesso dopo cattura o upload (data URL)
errorErrorErrore accesso fotocamera o stream

Validazione suggerita

import { z } from 'zod'

const schema = z.object({
  fotoDocumento: z.string()
    .startsWith('data:image/', 'L\'immagine non è in formato valido')
    .nullable()
    .refine(v => v !== null, { message: 'La foto del documento è obbligatoria' }),
})