Condividi tramite


Funzionamento del componente Windows Imaging

Individuazione e arbitrato

Prima che un'immagine possa essere decodificata, è necessario trovare un codec appropriato che possa decodificare tale formato di immagine. Nella maggior parte dei sistemi, poiché i formati di immagine supportati sono hardcoded, non è necessario alcun processo di individuazione. Poiché la piattaforma WiC (Windows Imaging Component) è estendibile, è necessario essere in grado di identificare il formato di un'immagine e associarla a un codec appropriato.

Per supportare l'individuazione in fase di esecuzione, ogni formato di immagine deve avere un modello di identificazione che può essere usato per identificare il decodificatore appropriato per tale formato. Per i nuovi formati di file, è consigliabile usare un GUID per il modello di identificazione, perché è garantito che sia univoco. Il modello di identificazione deve essere incorporato in ogni file di immagine conforme a tale formato di immagine. Ogni decodificatore ha una voce del Registro di sistema che specifica il modello di identificazione o i modelli dei formati di immagine che può decodificare. Quando un'applicazione deve aprire un'immagine, richiede un decodificatore da WIC. WIC cerca i decodificatori disponibili nel Registro di sistema e controlla ogni voce del Registro di sistema per individuare un criterio di identificazione che corrisponde al modello incorporato nel file di immagine. Per ulteriori informazioni sulle voci del Registro di sistema del decodificatore, vedere Encoder-Specific

Quando WIC trova un singolo decodificatore che corrisponde al modello di identificazione nell'immagine, crea un'istanza del decodificatore e vi passa il file di immagine. Se WIC trova più corrispondenze, richiama un metodo denominato QueryCapability su ogni decodificatore corrispondente per eseguire l'arbitrate tra di essi e trovare la corrispondenza migliore. Per ulteriori informazioni, vedere la sezione QueryCapabilities nella Implementazione di IWICBitmapDecoder.

Decodificazione

Dopo aver selezionato e creato un'istanza del decodificatore appropriato, l'applicazione comunica direttamente con il decodificatore. Il decodificatore ha diverse responsabilità, che implementa tramite varie interfacce. Questi servizi possono essere classificati come:

  • Servizi a livello di contenitore
  • Servizi a livello di frame
  • Servizi di enumerazione metadati
  • Trasformazioni del decodificatore nativo
  • Notifiche di stato e supporto per l'annullamento
  • Servizi di elaborazione non elaborati

I servizi a livello di contenitore includono il recupero della miniatura di primo livello (se supportato), la vista preliminare, i contesti di colore, la tavolozza (se applicabile) e il formato del contenitore, nonché l'accesso ai singoli fotogrammi immagine all'interno del contenitore. Alcuni contenitori contengono solo un singolo frame, mentre altri, ad esempio TiFF (Tagged Image File Format), possono contenere più fotogrammi. Questo set di servizi include anche informazioni sul decodificatore stesso e le relative funzionalità rispetto a un file di immagine specifico.

I singoli fotogrammi hanno miniature proprie e possono anche avere contesti di colore, tavolozze e altre proprietà visibili a livello di fotogramma. Tuttavia, l'operazione più importante eseguita a livello di fotogramma è la decodifica effettiva dei bit dell'immagine per quel fotogramma.

WIC fornisce lettori di metadati per i formati di metadati più comuni (IFD, EXIF, IPTC, XMP, APP0, APP1 e altri formati) e supporta anche l'estendibilità per i formati di metadati di terze parti. In questo modo il codec viene sollevato dalla responsabilità dell'analisi dei metadati. Tuttavia, il codec è responsabile dell'enumerazione dei blocchi di metadati e della richiesta di un lettore di metadati per ogni blocco. WIC esegue l'individuazione per i gestori di metadati nello stesso modo in cui funziona per i codec, in base a un criterio nell'intestazione del blocco corrispondente a un criterio nella voce del Registro di sistema del gestore di metadati. Per altre informazioni, vedere le voci del registro Encoder-Specific

I decodificatori non sono necessari per supportare in modo nativo le operazioni di trasformazione, ma in questo modo consentono ottimizzazioni significative delle prestazioni che offrono un'esperienza utente finale migliore. Ad esempio, un'applicazione può creare una pipeline di varie trasformazioni (ridimensionamento, ritaglio, rotazione e conversione in formato pixel) da eseguire su un'immagine prima del rendering dell'immagine. Per altre informazioni sulle pipeline di trasformazione, vedere IWICBitmapSource. Dopo aver creato una pipeline di trasformazione, l'applicazione richiede la trasformazione finale nella pipeline per produrre la bitmap risultante dall'applicazione di tutte le trasformazioni all'origine dell'immagine. A questo punto, se il decodificatore stesso è in grado di eseguire operazioni di trasformazione, WIC chiede quale delle trasformazioni richieste può eseguire. Le trasformazioni richieste che il decodificatore non può eseguire verranno eseguite da WIC sull'immagine decodificata prima di restituirla al chiamante. Questa pipeline di trasformazione ottimizzata offre prestazioni migliori rispetto all'esecuzione sequenziale di ogni trasformazione in memoria, in particolare quando alcune o tutte le trasformazioni possono essere eseguite durante il processo di decodifica.

Le notifiche di stato e il supporto per l'annullamento consentono a un'applicazione di richiedere notifiche di stato per operazioni lunghe e di consentire all'applicazione di consentire all'utente di annullare un'operazione che richiede troppo tempo. Questo aspetto è importante perché se un utente non può annullare un'operazione, può sentire che il processo è bloccato e provare a annullarlo chiudendo l'applicazione.

Queste interfacce sono descritte in dettaglio nella sezione Implementazione di un decodificatore abilitato per WIC.

I servizi di elaborazione non elaborati includono la regolazione delle impostazioni della fotocamera, ad esempio l'esposizione, il contrasto e la nitidezza o la modifica dello spazio dei colori prima di elaborare i bit non elaborati.

Codifica

Come i decodificatori, i codificatori hanno le responsabilità che implementano tramite interfacce. I servizi forniti dai codificatori sono complementari ai servizi forniti dai decodificatori, ad eccezione del fatto che scrivono i dati delle immagini anziché leggerli. I codificatori forniscono anche servizi nelle categorie seguenti:

  • Servizi a livello di contenitore
  • Servizi a livello di frame
  • Enumerazione dei metadati e servizi di aggiornamento
  • Notifica dei progressi e supporto per l'annullamento

I servizi a livello di contenitore per un codificatore includono l'impostazione della miniatura di livello superiore (se supportato), l'anteprima e la tavolozza (se applicabile) e l'iterazione dei singoli fotogrammi delle immagini in modo che questi possano essere serializzati nel contenitore.

I servizi a livello di frame per un codificatore rispecchiano quelli per un decodificatore, con la differenza che scrivono i dati dell'immagine, la miniatura e qualsiasi tavolozza associata o altro componente, anziché leggerli.

Inoltre, i servizi di enumerazione dei metadati per un codificatore includono l'iterazione dei blocchi di metadati da scrivere e richiamare i writer di metadati appropriati per serializzare i metadati su disco.

Queste interfacce sono descritte in dettaglio nella sezione Implementazione di un codificatore abilitato per WIC.

Durata di un codec

Viene istanziato un WIC Codec per gestire una singola immagine e solitamente ha una durata breve. Viene creato quando viene caricata un'immagine e viene rilasciata quando l'immagine viene chiusa. Un'applicazione può usare un numero elevato di codec contemporaneamente con durate sovrapposte (si pensi allo scorrimento di una directory contenente centinaia di immagini) e più applicazioni possono eseguire questa operazione contemporaneamente.

Anche se alcuni codec hanno una durata che ha come ambito la durata del processo in cui vivono, questo non è il caso dei codec WIC. La Galleria fotografica di Windows Vista, Esplora risorse di Windows e il Visualizzatore foto, oltre a numerose altre applicazioni, sono basati su WIC e usano il tuo codec per visualizzare immagini e anteprime. Se la durata del codec avesse come ambito la durata del processo, ogni volta che un'immagine o un'anteprima viene visualizzata in Esplora risorse di Windows, il codec crea un'istanza per decodificare quell'immagine e rimane in memoria fino al successivo riavvio del computer. Se il codec non viene mai scaricato, le relative risorse sono, in effetti, "perse" perché non possono essere usate da altri componenti del sistema.

Come abilitare un codec per WIC

  1. Implementare una classe decodificatore a livello di contenitore e una classe decodificatore a livello di frame che espone le interfacce WIC necessarie per decodificare le immagini e scorrere i blocchi di metadati. In questo modo tutte le applicazioni basate su WIC possono interagire con il codec allo stesso modo in cui interagiscono con i formati di immagine standard.
  2. Implementare una classe codificatore a livello di contenitore e una classe codificatore a livello di frame che espone le interfacce WIC necessarie per la codifica delle immagini e la serializzazione di blocchi di metadati in un file di immagine.
  3. Se il formato del contenitore non è basato su un contenitore TIFF o JPEG, potrebbe essere necessario scrivere gestori di metadati per i formati di metadati comuni (EXIF, XMP). Tuttavia, se si usa un formato di contenitore basato su TIFF o JPEG, questo non è necessario perché è possibile delegare ai gestori di metadati forniti dal sistema.
  4. Incorporare un modello di identificazione univoco (è consigliabile un GUID) in tutti i file di immagine. In questo modo, il formato dell'immagine può essere associato al codec durante la ricerca. Se si scrive un wrapper WIC per un formato di immagine esistente, è necessario trovare un modello di bit che il codificatore scrive sempre nei file di immagine univoci per tale formato di immagine e usarlo come modello di identificazione.
  5. Registrare il codec in fase di installazione. Ciò consente di individuare il codec in fase di esecuzione associando il modello di identificazione nel Registro di sistema con il modello incorporato nel file di immagine.
  6. A partire da Windows 7, WIC richiede che i codec siano di tipo apartment COM "Both". Ciò significa che è necessario effettuare un blocco appropriato per gestire i chiamanti inter-apartment e i chiamanti in scenari multi-thread. Per ulteriori informazioni, vedere la sezione successiva sul supporto per appartamento multi-threaded.
  7. Supporto per le piattaforme a 64 bit: per Windows 7, WIC richiederà che i codec WIC di terze parti vengano distribuiti sia come file binari nativi a 32 bit che a 64 bit. Inoltre, il modulo a 32 bit deve installare ed eseguire in sistemi a 64 bit e il programma di installazione codec di Windows 7 di terze parti deve installare sia i file binari a 32 bit che i file binari a 64 bit nei sistemi a 64 bit.

Supporto per il modello apartment multithreading in WIC

Gli oggetti in un appartamento multi-threaded (MTA) possono essere invocati simultaneamente da qualsiasi numero di thread nell'MTA. Ciò consente prestazioni migliori nei sistemi multi-core e in determinati scenari di server. Inoltre, i codec WIC in un MTA possono chiamare altri oggetti nell'MTA senza il costo del marshaling associato alle chiamate tra thread in diversi appartamenti STA. In Windows 7 tutti i codec WIC predefiniti sono stati aggiornati per supportare MTA, tra cui JPEG, TIFF, PNG, GIF, ICO e BMP. È altamente consigliato che i codec di terze parti vengano scritti per supportare gli MTAs. I codec di terze parti che non supportano MTA causano significativi costi di prestazioni nelle applicazioni multithread a causa del marshalling. L'abilitazione del supporto MTA richiede l'implementazione corretta della sincronizzazione nel codec di terze parti. L'implementazione esatta di queste tecniche di sincronizzazione esula dall'ambito di questo documento. Per altre informazioni sulla sincronizzazione degli oggetti COM, vedere Understanding and Using COM Threading Models.

Concettuale

Introduzione (come scrivere un codec abilitato per WIC)

Implementazione di un decodificatore abilitato per WIC

Come scrivere un codec abilitato per WIC

Panoramica del componente Windows Imaging

Panoramica dei metadati WIC