Condividi tramite


Implementazione di IWICDevelopRaw

IWICDevelopRaw

L'interfaccia IWICDevelopRaw espone opzioni di elaborazione specifiche per l'elaborazione di immagini non elaborate. Tutti i codec non elaborati devono supportare l'interfaccia IWICDevelopRaw. Alcuni codec non elaborati potrebbero non essere in grado di supportare tutte le impostazioni esposte da questa interfaccia, ma è necessario supportare tutte le impostazioni che il codec è in grado di eseguire. Come minimo, ogni codec non elaborato deve implementare i metodi SetRotation e SetRenderMode.

Inoltre, alcuni metodi e interfacce facoltativi per altri codec sono fortemente consigliati per i codec non elaborati. Questi includono i metodi GetPreview e GetThumbnail nella classe decodificatore a livello di contenitore e l'interfaccia IWICBitmapSourceTransform nella classe di decodifica a livello di fotogramma.

Le impostazioni impostate usando il IWICDevelopRaw metodi devono essere mantenute dal codec in modo coerente con il modo in cui gli altri metadati vengono mantenuti, ma non è mai necessario sovrascrivere le impostazioni originali "As Shot". Salvando in modo permanente i metadati e implementando LoadParameterSet e GetCurrentParameterSet, si abilitano le applicazioni di elaborazione non elaborate per recuperare e applicare le impostazioni di elaborazione tra le sessioni.

Uno scopo principale dell'interfaccia IWICDevelopRaw è consentire agli sviluppatori di applicazioni di creare un'interfaccia utente per modificare i parametri non elaborati che funzioneranno il più costantemente possibile in codec diversi. Si supponga che un utente finale regola i parametri usando un controllo dispositivo di scorrimento, con i relativi valori minimo e massimo mappati agli intervalli minimo e massimo per il parametro. Per supportare questa operazione, è necessario eseguire ogni sforzo per considerare tutti gli intervalli di parametri come lineari. Per assicurarsi che i controlli dispositivo di scorrimento non siano eccessivamente sensibili, è consigliabile supportare anche un intervallo più ampio possibile per ogni parametro, coprendo almeno il 50% dell'intervallo massimo possibile. Ad esempio, se l'intervallo massimo possibile di contrasto è dal grigio puro al bianco e nero puro, con il valore predefinito di cui viene eseguito il mapping a 0,0, l'intervallo minimo supportato da un codec è compreso tra almeno a metà tra il valore predefinito e il grigio puro sulla fascia bassa (–1,0), almeno a metà tra il valore predefinito e il bianco e nero puro sull'estremità alta (+1,0).

interface IWICDevelopRaw : IWICBitmapFrameDecode
{
   HRESULT QueryRawCapabilitiesInfo ( WICRawCapabilitiesInfo *pInfo );
   HRESULT LoadParameterSet ( WICRawParameterSet ParameterSet );
   HRESULT GetCurrentParameterSet ( IPropertyBag2 **ppCurrentParameterSet );
   HRESULT SetExposureCompensation ( double ev );
   HRESULT GetExposureCompensation ( double *pEV );
   HRESULT SetWhitePointRGB ( UINT Red, UINT Green, UINT Blue );
   HRESULT GetWhitePointRGB ( UINT *pRed, UINT *pGreen, UINT *pBlue );
   HRESULT SetNamedWhitePoint ( WICNamedWhitePoint WhitePoint );
   HRESULT GetNamedWhitePoint ( WICNamedWhitePoint *pWhitePoint );
   HRESULT SetWhitePointKelvin ( UINT WhitePointKelvin );
   HRESULT GetWhitePointKelvin ( UINT *pWhitePointKelvin );
   HRESULT GetKelvinRangeInfo ( UINT *pMinKelvinTemp,
               UINT *pMaxKelvinTemp,
               UINT *pKelvinTempStepValue );
   HRESULT SetContrast ( double Contrast );
   HRESULT GetContrast ( double *pContrast );
   HRESULT SetGamma ( double Gamma );
   HRESULT GetGamma ( double *pGamma );
   HRESULT SetSharpness ( double Sharpness );
   HRESULT GetSharpness ( double *pSharpness );
   HRESULT SetSaturation ( double Saturation );
   HRESULT GetSaturation ( double *pSaturation );
   HRESULT SetTint ( double Tint );
   HRESULT GetTint ( double *pTint );
   HRESULT SetNoiseReduction ( double NoiseReduction );
   HRESULT GetNoiseReduction ( double *pNoiseReduction );
   HRESULT SetDestinationColorContext (const IWICColorContext *pColorContext );
   HRESULT SetToneCurve ( UINT cbToneCurveSize,
               const WICRawToneCurve *pToneCurve );
   HRESULT GetToneCurve ( UINT cbToneCurveBufferSize,
               WICRawToneCurve *pToneCurve,
               UINT *pcbActualToneCurveBufferSize );
   HRESULT SetRotation ( double Rotation );
   HRESULT GetRotation ( double *pRotation );
   HRESULT SetRenderMode ( WICRawRenderMode RenderMode );
   HRESULT GetRenderMode ( WICRawRenderMode *pRenderMode ); 
   HRESULT SetNotificationCallback ( IWICDevelopRawNotificationCallback 
               *pCallback );
}

QueryRawCapabilitiesInfo

QueryRawCapabilitiesInfo restituisce il set di funzionalità supportate per questo file non elaborato. La struttura diWICRawCapabilitiesInfoè definita come segue:

struct WICRawCapabilitiesInfo
{
   UINT cbSize;
   UINT CodecMajorVersion;
   UINT CodecMinorVersion;
   WICRawCapabilities ExposureCompensationSupport;
   WICRawCapabilities ContrastSupport;
   WICRawCapabilities RGBWhitePointSupport;
   WICRawCapabilities NamedWhitePointSupport;
   UINT NamedWhitePointSupportMask;
   WICRawCapabilities KelvinWhitePointSupport;
   WICRawCapabilities GammaSupport;
   WICRawCapabilities TintSupport;
   WICRawCapabilities SaturationSupport;
   WICRawCapabilities SharpnessSupport;
   WICRawCapabilities NoiseReductionSupport;
   WICRawCapabilities DestinationColorProfileSupport;
   WICRawCapabilities ToneCurveSupport;
   WICRawRotationCapabilities RotationSupport;              
}

L'enumerazione WICRawCapabilities usata in questa struttura è definita come:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

Il campo finale è un'enumerazione WICRawRotationCapabilities definita come:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet consente all'utente di specificare se usare le impostazioni As Shot, usare le impostazioni modificate dall'utente o richiedere al decodificatore di correggere automaticamente l'immagine.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet restituisce un IPropertyBag2 con il set di parametri corrente. Il chiamante può quindi passare questo parametro impostato al codificatore da usare come opzioni del codificatore.

Set/GetCompensazione Esposizione

GetExposureCompensation e SetExposureCompensation indicare la compensazione dell'esposizione da applicare all'output finale. L'intervallo valido per EV è da -5,0 a +5,0 stop.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Queste funzioni forniscono tutti modi per ottenere e impostare il punto bianco, come valore RGB, un valore denominato preimpostato o come valore Kelvin. L'intervallo accettabile per Kelvin è 1.500 - 30.000.

Imposta/OttieniContrasto

GetContrast e SetContrast indicano la quantità di contrasto da applicare all'output. L'intervallo valido da specificare il contrasto è da -1,0 a +1,0, con il contrasto predefinito 0,0.

Set/GetGamma

GetGamma e SetGamma indicano il Gamma da applicare. L'intervallo valido per Gamma è compreso tra 0,2 e 5,0, con 1,0 come impostazione predefinita. Gamma solitamente viene implementata usando la funzione di potenza Gamma tradizionale (una funzione di potenza lineare con guadagno unitario). La luminosità aumenta con l'aumento della gamma e diminuisce man mano che gamma si avvicina allo zero. Si noti che il valore minimo è diverso da zero, perché zero genererebbe un errore di divisione per zero nei calcoli gamma tradizionali. Il limite minimo logico è 1/max, motivo per cui il valore minimo è 0,2.

Set/GetSharpness

GetSharpness e SetSharpness indicano la quantità di nitidezza da applicare. L'intervallo valido è da –1,0 a +1,0, con 0,0 come la quantità predefinita di affilatura e –1,0 che indica che non è affatto possibile affilare.

Imposta/OttieniSaturazione

GetSaturation e SetSaturation indicano la quantità di saturazione da applicare. L'intervallo valido per specificare la saturazione è da –1,0 a +1,0; 0,0 rappresenta la saturazione normale, -1,0 rappresenta la desaturazione completa e +1,0 rappresenta la saturazione completa.

Imposta/OttieniTonalità

GetTint e SetTint indicano la tinta da applicare, con una predominanza di verde/magenta. L'intervallo valido è da -1,0 a +1,0, con verde che si trova sul lato negativo della scala e magenta sul positivo. La scala della tinta è definita ortogonale alla temperatura del colore.

Imposta/OttieniRiduzioneRumore

GetNoiseReduction e SetNoiseReduction indicano la quantità di riduzione del rumore da applicare. L'intervallo valido da è –1,0 a +1,0, con 0,0 che indica la quantità predefinita di riduzione del rumore, –1,0 che indica nessuna riduzione del rumore e +1,0 che indica la riduzione massima del rumore.

ImpostaContestoColoreDestinazione

SetDestinationColorContext specifica il profilo colore da applicare all'immagine. È possibile chiamare GetColorContexts per recuperare il profilo colore corrente.

Set/GetToneCurve

GetToneCurve e SetToneCurve specificare la curva del tono da applicare. Si assuma l'interpolazione lineare tra i punti. Il pToneCurve è una struttura WICRawToneCurve , che contiene una matrice di strutture WICRawToneCurvePoint e un numero di punti nella matrice.

struct WICRawToneCurve 
{
   UINT cPoints;
   WICRawToneCurvePoint aPoints[];
}

Un WICRawToneCurvePoint contiene un valore di input e un valore di output.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Quando il chiamante passa NULL nel parametro pToneCurve, è necessario specificare le dimensioni richieste per il WICRawToneCurve nel parametro pcbActualToneCurveBufferSize.

Imposta/OttieniRotazione

GetRotation e SetRotation indicano il grado di rotazione da applicare. Una rotazione di 90,0 specifica una rotazione di 90 gradi in senso orario. La differenza tra l'uso di SetRotation e l'impostazione della rotazione usando il metodoCopyPixelsconsiste nel fatto che l'angolo di rotazione impostato utilizzando SetRotation deve essere salvato in modo permanente dal codec, mentre l'impostazione della rotazione attraverso CopyPixels ruota solo l'immagine in memoria.

Set/GetRenderMode

GetRenderMode e SetRenderMode indicano il livello di qualità dell'output richiesto dal chiamante. Quando un utente modifica i parametri, l'applicazione dovrebbe visualizzare un'approssimazione molto rapida dell'aspetto dell'immagine effettiva se vengono applicate le modifiche. A questo scopo, l'immagine viene in genere visualizzata alla risoluzione dello schermo o inferiore, anziché alla risoluzione effettiva dell'immagine, per fornire feedback immediato all'utente. Questo è quando un'applicazione richiede la qualità della modalità bozza, quindi dovrebbe essere molto veloce. Quando l'utente ha apportato tutte le modifiche, le ha visualizzate in anteprima in modalità bozza e ha deciso di decodificare l'immagine completa con le impostazioni correnti, l'applicazione richiede un codice di migliore qualità. Questa operazione viene in genere richiesta anche per la stampa. Se è necessario un compromesso ragionevole tra velocità e qualità, l'applicazione richiede la qualità normale.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback registra una funzione di callback che il decodificatore chiamerà quando uno qualsiasi dei parametri di elaborazione Raw cambia. La firma per il IWICDevelopRawNotificationCallback ha un solo metodo, chiamato Notify. Notify ha un singolo parametro, ovvero una maschera che indica quali parametri di elaborazione non elaborati sono stati modificati.

HRESULT Notify ( UINT NotificationMask );

Un'operazione OR viene eseguita sui valori seguenti per NotificationMask.

WICRawChangeNotification_ExposureCompensation
WICRawChangeNotification_NamedWhitePoint
WICRawChangeNotification_KelvinWhitePoint
WICRawChangeNotification_RGBWhitePoint
WICRawChangeNotification_Contrast
WICRawChangeNotification_Gamma
WICRawChangeNotification_Sharpness
WICRawChangeNotification_Saturation
WICRawChangeNotification_Tint
WICRawChangeNotification_NoiseReduction
WICRawChangeNotification_DestinationColorContext
WICRawChangeNotification_ToneCurve
WICRawChangeNotification_Rotation
WICRawChangeNotification_RenderMode

riferimento

IWICDevelopRaw

concettuale

Implementazione di IWICBitmapSourceTransform

Implementazione di un WIC-Enabled codificatore

Come scrivere un WIC-Enabled CODEC

Panoramica di Windows Imaging Component