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 Windows Imaging Component (WIC) è 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 un criterio di identificazione corrispondente al modello incorporato nel file di immagine. Per altre informazioni sulle voci del Registro di sistema del decodificatore, vedere Voci del Registro di sistema specifiche del codificatore

Quando WIC trova un singolo decodificatore che corrisponde al modello di identificazione nell'immagine, crea un'istanza del decodificatore e passa il file di immagine. Se WIC trova più corrispondenze, richiama un metodo denominato QueryCapability per ogni decodificatore corrispondente per eseguire l'abitrate tra di esse e trovare la corrispondenza migliore. Per altre informazioni, vedere la sezione QueryCapabilitiesnell'implementazione di IWICBitmapDecoder.

Decodifica

Dopo aver selezionato e creato un'istanza del decodificatore appropriato, l'applicazione comunica direttamente al 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 dei 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 dell'anteprima di primo livello (se supportato), l'anteprima, i contesti di colore, la tavolozza (se applicabile) e il formato del contenitore, oltre a fornire l'accesso ai singoli fotogrammi di immagine all'interno del contenitore. Alcuni contenitori contengono solo un singolo fotogramma, mentre altri, ad esempio il formato TIFF (Tagged Image File Format), possono contenere più fotogrammi. Questo set di servizi include anche informazioni sul decodificatore stesso e sulle relative funzionalità rispetto a un file di immagine specifico.

I singoli fotogrammi hanno anteprime personalizzate e possono anche avere contesti di colore, tavolozze e altre proprietà esposte a livello di frame. L'operazione più importante eseguita a livello di frame, tuttavia, è la decodifica effettiva dei bit dell'immagine per tale frame.

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. Questo consente di liberare il codec della 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 allo stesso modo per i codec, in base a un modello nell'intestazione del blocco corrispondente a un criterio nella voce del Registro di sistema del gestore dei metadati. Per altre informazioni, vedere Le voci del Registro di sistema specifiche del codificatore

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 del 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 sullo stato di avanzamento 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, è possibile che il processo sia bloccato e tentare di 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 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é leggerlo. 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
  • Supporto per notifiche e annullamento dello stato di avanzamento

I servizi a livello di contenitore per un codificatore includono l'impostazione dell'anteprima di primo livello (se supportato), l'anteprima e la tavolozza (se applicabile) e l'iterazione dei singoli fotogrammi di immagine in modo che possano essere serializzati nel contenitore.

I servizi a livello di frame per un codificatore eseguono il mirroring di quelli per il decodificatore, ad eccezione del fatto che scrivono i dati dell'immagine, l'anteprima 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 richiamando 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 creata un'istanza di un codec WIC per gestire una singola immagine e in genere 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 con ambito per la durata del processo in cui vivono, questo non è il caso dei codec WIC. La Raccolta foto di Windows Vista, Esplora risorse e Visualizzatore foto, oltre a numerose altre applicazioni, è basata su WIC e usa il codec per visualizzare immagini e anteprime. Se l'ambito della durata del codec è stato limitato alla durata del processo, ogni volta che un'immagine o un'anteprima è stata visualizzata in Windows Vista Explorer, il codec di cui è stata creata un'istanza per decodificare tale immagine rimarrà in memoria fino alla successiva riavvio del computer da parte dell'utente. 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 WIC un codec

  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. Ciò consente a tutte le applicazioni basate su WIC di interagire con il codec nello 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 deve essere confrontato con il codec durante l'individuazione. Se si scrive un wrapper WIC per un formato di immagine esistente, è necessario trovare un modello di bit che il codificatore scrive sempre nei relativi file di immagine univoci in 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 eseguire il blocco appropriato per gestire i chiamanti e i chiamanti tra apartment in scenari multithreading. Per altre informazioni, vedere la sezione successiva sul supporto di apartment a thread multipli.
  7. Supporto per le piattaforme a 64 bit: per Windows 7, WIC richiederà che i codec WIC di terze parti vengano distribuiti come file binari nativi a 32 bit e a 64 bit. Inoltre, il modulo a 32 bit deve installare ed eseguire nei 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 apartment multithread in WIC

Gli oggetti all'interno di un apartment multithreading (MTA) possono essere chiamati simultaneamente da qualsiasi numero di thread all'interno dell'MTA. Ciò consente prestazioni migliori nei sistemi multicore e in determinati scenari di server. Inoltre, i codec WIC in un MTA possono chiamare altri oggetti nell'MTA senza il costo di marshalling associato alla chiamata tra thread in appartamenti STA diversi. In Windows 7 tutti i codec WIC predefiniti sono stati aggiornati per supportare MTA, tra cui JPEG, TIFF, PNG, GIF, ICO e BMP. È consigliabile scrivere codec di terze parti per supportare gli MTA. I codec di terze parti che non supportano mta causano costi di prestazioni significativi 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.For more information on synchronizing COM objects, see Understanding and Using COM Threading Models.

Informazioni concettuali

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