Partager via


Implémentation d’IWICDevelopRaw

IWICDevelopRaw

L’interface IWICDevelopRaw expose des options de traitement spécifiques au traitement d’images brutes. Tous les codecs bruts doivent prendre en charge l’interface IWICDevelopRaw . Certains codecs bruts peuvent ne pas être en mesure de prendre en charge tous les paramètres exposés par cette interface, mais vous devez prendre en charge tous les paramètres que votre codec est capable d’effectuer. Au minimum, chaque codec brut doit implémenter les méthodes SetRotation et SetRenderMode .

En outre, certaines méthodes et interfaces facultatives pour d’autres codecs sont fortement recommandées pour les codecs bruts. Il s’agit notamment des méthodes GetPreview et GetThumbnail sur la classe de décodeur au niveau du conteneur, et l’interface IWICBitmapSourceTransform sur la classe de décodage au niveau de l’image.

Les paramètres définis à l’aide des méthodes IWICDevelopRaw doivent être conservés par le codec de manière cohérente avec la façon dont les autres métadonnées sont conservées, mais vous ne devez jamais remplacer les paramètres « As Shot » d’origine. En persistant les métadonnées et en implémentant LoadParameterSet et GetCurrentParameterSet, vous permettez aux applications de traitement brut de récupérer et d’appliquer des paramètres de traitement entre les sessions.

Un main’objectif de l’interface IWICDevelopRaw est de permettre aux développeurs d’applications de créer une interface utilisateur pour ajuster les paramètres bruts qui fonctionneront de la manière la plus cohérente possible entre différents codecs. Supposons qu’un utilisateur final ajuste les paramètres à l’aide d’un contrôle de curseur, avec ses valeurs minimales et maximales mappées aux plages minimale et maximale pour le paramètre. Pour prendre en charge ce problème, vous devez tout mettre en œuvre pour traiter toutes les plages de paramètres comme linéaires. Pour vous assurer que les contrôles de curseur ne sont pas trop sensibles, vous devez également prendre en charge une plage aussi large que possible pour chaque paramètre, couvrant au moins 50 % de la plage maximale possible. Par exemple, si la plage de contraste maximale possible est comprise entre le gris pur et le noir et le blanc purs, la valeur par défaut étant mappée à 0,0, la plage minimale prise en charge par un codec est d’au moins à mi-chemin entre la valeur par défaut et le gris pur à l’extrémité inférieure (–1.0), à au moins à mi-chemin entre la valeur par défaut et le noir et blanc pur sur l’extrémité supérieure (+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 retourne l’ensemble des fonctionnalités prises en charge pour ce fichier brut. La structure WICRawCapabilitiesInfo est définie comme suit :

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’énumération WICRawCapabilities utilisée dans cette structure est définie comme suit :

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

Le dernier champ est une énumération WICRawRotationCapabilities , définie comme suit :

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet permet à l’utilisateur de spécifier s’il faut utiliser les paramètres As Shot, utiliser des paramètres ajustés par l’utilisateur ou demander au décodeur de corriger automatiquement l’image.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet retourne un IPropertyBag2 avec l’ensemble de paramètres actuel. L’appelant peut ensuite passer ce paramètre défini à l’encodeur à utiliser comme options d’encodeur.

Set/GetExposureCompensation

GetExposureCompensation et SetExposureCompensation indiquent la compensation d’exposition à appliquer à la sortie finale. La plage valide pour ev est de -5,0 à +5,0 arrêts.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Ces fonctions fournissent toutes des moyens d’obtenir et de définir le point blanc, soit sous forme de valeur RVB, de valeur nommée prédéfinie ou de valeur Kelvin. La plage acceptable pour Kelvin est de 1 500 à 30 000.

Set/GetContrast

GetContrast et SetContrast indiquent la quantité de contraste à appliquer à la sortie. La plage valide pour spécifier le contraste est de -1.0 à +1.0, le contraste par défaut étant 0.0.

Set/GetGamma

GetGamma et SetGamma indiquent le gamma à appliquer. La plage valide pour Gamma est comprise entre 0,2 et 5,0, 1.0 étant la valeur par défaut. Gamma est généralement implémenté à l’aide de la fonction d’alimentation Gamma traditionnelle (fonction d’alimentation linéaire avec gain d’unité). La luminosité augmente avec l’augmentation de Gamma et diminue à mesure que Gamma approche de zéro. (Notez que la valeur minimale est différente de zéro, car zéro entraînerait une erreur de division par zéro dans les calculs Gamma traditionnels. La limite minimale logique est 1/max, ce qui explique pourquoi le minimum est de 0,2.)

Set/GetSharpness

GetSharpness et SetSharpness indiquent la quantité de netteté à appliquer. La plage valide est de -1.0 à +1.0, 0.0 étant la quantité par défaut de netteté, et -1.0 indiquant l’absence de netteté du tout.

Set/GetSaturation

GetSaturation et SetSaturation indiquent la quantité de saturation à appliquer. La plage valide pour spécifier la saturation est de -1.0 à +1.0, 0.0 étant une saturation normale, -1.0 représentant la désaturation complète et +1.0 représentant la saturation totale.

Set/GetTint

GetTint et SetTint indiquent la teinte à appliquer, sur un biais vert/magenta. La plage valide est de –1,0 à +1,0, le vert étant du côté négatif de l’échelle et le magenta sur le positif. L’échelle de teinte est définie comme étant orthogonale à la température de couleur.

Set/GetNoiseReduction

GetNoiseReduction et SetNoiseReduction indiquent la quantité de réduction du bruit à appliquer. La plage valide à est de -1.0 à +1.0, 0.0 indiquant la quantité par défaut de réduction du bruit, -1.0 indiquant l’absence de réduction du bruit et +1.0 indiquant la réduction maximale du bruit.

SetDestinationColorContext

SetDestinationColorContext spécifie le profil de couleur à appliquer à l’image. Vous pouvez appeler GetColorContexts pour récupérer le profil de couleur actuel.

Set/GetToneCurve

GetToneCurve et SetToneCurve spécifient la courbe de tonalité à appliquer. Supposons l’interpolation linéaire entre les points. PToneCurve est une structure WICRawToneCurve, qui contient un tableau de structures WICRawToneCurvePoint et un nombre de points dans le tableau.

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

Un WICRawToneCurvePoint contient une valeur d’entrée et une valeur de sortie.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Lorsque l’appelant transmet NULL dans le paramètre pToneCurve , vous devez renvoyer la taille requise pour le WICRawToneCurve dans le paramètre pcbActualToneCurveBufferSize .

Set/GetRotation

GetRotation et SetRotation indiquent le degré de rotation à appliquer. Une rotation de 90,0 spécifie une rotation de 90 degrés dans le sens des aiguilles d’une montre. (La différence entre l’utilisation de SetRotation et la définition de la rotation à l’aide de la méthode CopyPixels est que l’angle de rotation défini à l’aide de SetRotation doit être conservé par le codec, tandis que la définition de la rotation via CopyPixels fait uniquement pivoter l’image en mémoire.

Set/GetRenderMode

GetRenderMode et SetRenderMode indiquent le niveau de qualité de la sortie requise par l’appelant. Lorsqu’un utilisateur ajuste les paramètres, l’application doit afficher une approximation très rapide de ce à quoi ressemblera l’image réelle si les modifications sont appliquées. À cette fin, l’image est généralement affichée à la résolution de l’écran ou moins, plutôt que la résolution d’image réelle, pour fournir un commentaire immédiat à l’utilisateur. C’est à ce moment qu’une application demande la qualité du mode Brouillon, ce qui doit être très rapide. Lorsque l’utilisateur a apporté toutes les modifications, les a aperçues en mode brouillon et a décidé de décoder l’image complète avec les paramètres actuels, l’application demande un décodage de meilleure qualité. Cela est généralement également demandé pour l’impression. Lorsqu’un compromis raisonnable entre vitesse et qualité est requis, l’application demande qualité normale.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback inscrit une fonction de rappel que le décodeur doit appeler lorsque l’un des paramètres de traitement Brut change. La signature du IWICDevelopRawNotificationCallback n’a qu’une seule méthode, appelée Notify. Notify a un seul paramètre, qui est un masque qui indique lequel des paramètres de traitement bruts a changé.

HRESULT Notify ( UINT NotificationMask );

Une opération OR est effectuée sur les valeurs suivantes pour 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

Informations de référence

IWICDevelopRaw

Conceptuel

Implémentation d’IWICBitmapSourceTransform

Implémentation d’un encodeur WIC-Enabled

Comment écrire un codec WIC-Enabled

Vue d’ensemble du composant d’acquisition d’images Windows