compressione Image-Data

[La funzionalità associata a questa pagina, Gestione compressione video, è una funzionalità legacy. Microsoft consiglia vivamente che il nuovo codice non usi questa funzionalità.

L'applicazione può usare una serie di funzioni ICCompress e macro per comprimere i dati. Le funzioni e le macro consentono di eseguire le attività seguenti:

  • Determinare il formato di compressione da usare per un formato di input specificato.
  • Preparare il compressore.
  • Comprimere i dati.
  • Compressione finale.

L'applicazione può aumentare il controllo sul processo di compressione usando le funzioni ICCompress e le macro. Questo gruppo di funzioni e macro gestisce singoli fotogrammi, anziché la sequenza nel suo complesso. Ad esempio, l'applicazione può identificare i frame da comprimere come fotogrammi chiave usando la funzione ICCompress .

Un compressore riceve i dati in un formato, comprime i dati e restituisce una versione compressa dei dati usando un formato specificato. Il formato di input tipico specifica i database DIB usando la struttura BITMAPINFO . Il formato di output tipico specifica i dib compressi, usando anche la struttura BITMAPINFO .

Nota

Per ridurre al minimo la riduzione dell'immagine e dell'audio durante la riproduzione, evitare di comprimere un file AVI più di una volta. Combinare pezzi non compressi di video nel sistema di modifica e quindi comprimere il prodotto finale.

 

Selezione del formato di compressione e del compressore

Se si desidera comprimere i dati e l'applicazione richiede un formato di output specifico, inviare il messaggio ICM_COMPRESS_QUERY (o usare la macro ICCompressQuery ) per eseguire query sul compressore per determinare se supporta i formati di input e output.

Se il formato di output non è importante per l'applicazione, è necessario trovare solo un compressore che può gestire il formato di input. Per determinare se un compressore può gestire il formato di input, è possibile inviare ICM_COMPRESS_QUERY, specificando NULL per il parametro lParam . Questo messaggio non restituisce il formato di output all'applicazione. L'applicazione può determinare le dimensioni del buffer necessarie per i dati che specificano il formato di compressione inviando il messaggio di ICM_COMPRESS_GET_FORMAT (o usare la macro ICCompressGetFormatSize ). È anche possibile recuperare i dati di formato inviando ICM_COMPRESS_GET_FORMAT (o la macro ICCompressGetFormat ).

Se si vuole determinare il buffer più grande che il compressore potrebbe richiedere per la compressione, inviare il messaggio ICM_COMPRESS_GET_SIZE (o usare la macro ICCompressGetSize ). È possibile usare il numero di byte restituiti dalla funzione ICSendMessage per allocare un buffer per le compressione di immagini successive.

Inizializzazione del compressore

Dopo aver selezionato un compressore che può gestire i formati di input e di output necessari, è possibile inizializzare il compressore usando il messaggio ICM_COMPRESS_BEGIN (o usare la macro ICCompressBegin ). Questo messaggio richiede l'handle del compressore e i formati di input e output.

Compressione dei dati

È possibile usare la funzione ICCompress per comprimere un frame. L'applicazione deve usare ripetutamente questa funzione fino a quando non vengono compressi tutti i fotogrammi in una sequenza. L'applicazione deve tenere traccia e aumentare anche il numero di ogni frame compresso con ICCompress. Il compressore usa questo valore per verificare se i fotogrammi vengono inviati fuori ordine durante la compressione temporale veloce (archiviando le differenze tra fotogrammi successivi). Se l'applicazione ricomprime un frame, deve usare lo stesso numero di frame del momento in cui il frame è stato compresso per la prima volta. Se l'applicazione comprime un'immagine ancora frame, può specificare un numero di frame pari a zero.

L'applicazione può usare il flag ICCOMPRESS_KEYFRAME per rendere il frame compresso da ICCompress un fotogramma chiave.

Quando VCM restituisce il controllo all'applicazione dopo aver compresso un frame, VCM archivia i dati compressi nelle strutture a cui fa riferimento i parametri lpbiOutput e lpData . Se l'applicazione deve spostare i dati compressi, può trovare le dimensioni nel membro biSizeImage della struttura BITMAPINFO specificata in lpbiOutput.

Nota

L'applicazione deve allocare le strutture e i buffer che archiviano i dati non compressi e compressi. Se il compressore supporta la compressione temporale, l'applicazione deve allocare anche una struttura e un buffer per contenere il formato e i dati per il frame precedente di informazioni.

 

Compressione finale

Dopo che l'applicazione ha compresso i dati, può usare la macro ICCompressEnd per notificare al compressore che è stato completato. Se si vuole riavviare la compressione dopo l'uso di questa funzione, l'applicazione deve reinizializzare il compressore inviando il messaggio di ICM_COMPRESS_BEGIN (o usare la macro ICCompressBegin ).