Implementieren von IWICDevelopRaw

IWICDevelopRaw

Die IWICDevelopRaw-Schnittstelle macht verarbeitungsspezifische Verarbeitungsoptionen für die Bildverarbeitung verfügbar. Alle unformatierten Codecs müssen die IWICDevelopRaw-Schnittstelle unterstützen. Einige unformatiert Codecs können möglicherweise nicht jede Einstellung unterstützen, die von dieser Schnittstelle verfügbar gemacht wird, aber Sie sollten alle Einstellungen unterstützen, die Ihr Codec ausführen kann. Jeder unformatiert Codec muss mindestens die Methoden SetRotation und SetRenderMode implementieren.

Darüber hinaus werden einige Methoden und Schnittstellen, die für andere Codecs optional sind, dringend für unformatiert Codecs empfohlen. Dazu gehören die GetPreview- und GetThumbnail-Methoden für die Decoderklasse auf Containerebene und die IWICBitmapSourceTransform-Schnittstelle für die Decodierungsklasse auf Frameebene.

Einstellungen mithilfe der IWICDevelopRaw-Methoden festgelegt werden, sollte der Codec auf eine Weise beibehalten werden, die mit der Art und Weise konsistent ist, wie andere Metadaten beibehalten werden, aber Sie sollten die ursprünglichen "As Shot"-Einstellungen nie überschreiben. Indem Sie die Metadaten beibehalten und LoadParameterSet und GetCurrentParameterSetimplementieren, ermöglichen Sie Rohverarbeitungsanwendungen das Abrufen und Anwenden von Verarbeitungseinstellungen sitzungsübergreifend.

Ein Hauptzweck der IWICDevelopRaw-Schnittstelle ist es, Anwendungsentwicklern zu ermöglichen, eine Benutzeroberfläche zum Anpassen von Rohparametern zu erstellen, die so konsistent wie möglich über verschiedene Codecs hinweg funktionieren. Angenommen, ein Endbenutzer passt die Parameter mithilfe eines Schieberegler-Steuerelements an, dessen Mindest- und Höchstwerte den minimalen und maximalen Bereichen für den Parameter zugeordnet sind. Um dies zu unterstützen, sollten Sie alle Parameterbereiche als linear behandeln. Um sicherzustellen, dass die Schieberegler-Steuerelemente nicht zu sensibel sind, sollten Sie auch so weit wie möglich für jeden Parameter unterstützen, der mindestens 50 Prozent des maximal möglichen Bereichs umfasst. Beispiel: Wenn der maximal mögliche Kontrastbereich von rein grau bis rein schwarz und weiß ist und der Standardwert 0,0 zugeordnet wird, liegt der von einem Codec unterstützte Mindestbereich mindestens in der Mitte zwischen dem Standardwert und reinem Grau am unteren Ende (–1,0) bis mindestens der Hälfte zwischen dem Standardwert und rein schwarz und weiß am hohen Ende (+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 gibt den Satz unterstützter Funktionen für diese Rohdatendatei zurück. Die WICRawCapabilitiesInfo-Struktur ist wie folgt definiert:

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;              
}

Die in dieser Struktur verwendete WICRawCapabilities-Enumeration ist wie die folgenden definiert:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

Das letzte Feld ist eine WICRawRotationCapabilities-Enumeration, definiert als:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet ermöglicht es dem Benutzer anzugeben, ob As Shot-Einstellungen verwendet, benutzerspezifische Einstellungen verwendet oder der Decoder zur automatischen Korrektur des Bilds aufgerufen werden soll.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet gibt IPropertyBag2 mit dem aktuellen Parametersatz zurück. Der Aufrufer kann diesen Parametersatz dann an den Encoder übergeben, um ihn als Encoderoptionen zu verwenden.

Set/GetExposureCompensation

GetExposureCompensation und SetExposureCompensation geben die Kompensierung der Belichtung an, die auf die endgültige Ausgabe angewendet werden soll. Der gültige Bereich für EV ist –5,0 bis +5,0 Stopps.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Alle diese Funktionen bieten Möglichkeiten zum Erhalten und Festlegen des Weißpunkts, entweder als RGB-Wert, als voreingestellter benannter Wert oder als Kelvin-Wert. Der zulässige Bereich für Kelvin liegt zwischen 1.500 und 30.000.

Set/GetContrast

GetContrast und SetContrast geben den Kontrast an, der auf die Ausgabe angewendet werden soll. Der gültige Bereich zum Angeben des Kontrasts ist –1,0 bis +1,0, der Standardkontrast ist 0,0.

Set/GetGamma

GetGamma und SetGamma geben das anzuwendende Gamma an. Der gültige Bereich für Gamma ist 0,2 bis 5,0, und 1,0 ist der Standardwert. Gamma wird in der Regel mit der herkömmlichen Gamma-Energiefunktion (einer linearen Energiefunktion mit Unity-Gewinn) implementiert. Die Helligkeit wird mit zunehmender Gamma-Zahl erhöht und verringert, wenn gamma null erreicht wird. (Beachten Sie, dass der Mindestwert nicht 0 (null) ist, da 0 in herkömmlichen Gammaberechnungen zu einem Fehler aufgrund einer Division durch 0 (null) führen würde. Der logische Mindestgrenzwert ist 1/max, weshalb der Mindestwert 0,2 beträgt.)

Set/GetSharpness

GetSharpness und SetSharpness geben an, wie viel Schärfe angewendet werden soll. Der gültige Bereich ist –1,0 bis +1,0, 0,0 ist die Standardmenge der Schärfe, und –1,0 gibt an, dass überhaupt keine Schärfe angezeigt wird.

Set/GetSaturation

GetSaturation und SetSaturation geben die Sättigung an, die angewendet werden soll. Der gültige Bereich zum Angeben der Sättigung ist –1,0 bis +1,0, 0,0 ist normale Sättigung, –1,0 steht für vollständige Desaturierung und +1,0 für vollständige Sättigung.

Set/GetTint

GetTint und SetTint geben den zu übernehmenden Tönungston bei einem Grün/Magenta-Bias an. Der gültige Bereich ist –1,0 bis +1,0, und grün befindet sich auf der negativen Seite der Skala und Magenta auf dem positiven Wert. Die Farbtonskala ist als orthogonal zu Farbtemperatur definiert.

Set/GetNoiseReduction

GetNoiseReführung und SetNoiseReführung geben an, wie viel Rauschunterdrückung angewendet werden soll. Der gültige Bereich bis ist –1,0 bis +1,0, und 0,0 gibt die Standardmenge der Rauschunterdrückung an, –1,0 gibt keine Rauschunterdrückung an, und +1,0 gibt die maximale Rauschunterdrückung an.

SetDestinationColorContext

SetDestinationColorContext gibt das Farbprofil an, das auf das Bild angewendet werden soll. Sie können GetColorContexts aufrufen, um das aktuelle Farbprofil abzurufen.

Set/GetToneCurve

GetToneCurve und SetToneCurve geben die anzuwendende Tonkurve an. Gehen Sie von einer linearen Interpolation zwischen Punkten aus. pToneCurve ist eine WICRawToneCurve-Struktur, die ein Array von WICRawToneCurvePoint-Strukturen und die Anzahl der Punkte im Array enthält.

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

Ein WICRawToneCurvePoint enthält einen Eingabewert und einen Ausgabewert.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Wenn der Aufrufer NULL im pToneCurve-Parameter übergibt, sollten Sie die erforderliche Größe für WICRawToneCurve im parameteractualToneCurveBufferSize zurückgeben.

Set/GetRotation

GetRotation und SetRotation geben den Grad der anzuwendenden Drehung an. Eine Drehung von 90,0 würde eine Drehung von 90 Grad im Uhrzeigersinn angeben. (Der Unterschied zwischen der Verwendung von SetRotation und dem Festlegen der Drehung mithilfe der CopyPixels-Methode ist, dass der mit SetRotation festgelegte Drehwinkel vom Codec beibehalten werden soll, während das Festlegen der Drehung über CopyPixels nur das Bild im Arbeitsspeicher dreht.

Set/GetRenderMode

GetRenderMode und SetRenderMode geben die Qualitätsstufe der Ausgabe an, die der Aufrufer benötigt. Wenn ein Benutzer Parameter an passt, sollte die Anwendung eine sehr schnelle Annäherung an das tatsächliche Bild anzeigen, wenn die Änderungen angewendet werden. Zu diesem Zweck wird das Bild in der Regel in der Bildschirmauflösung oder weniger als in der tatsächlichen Bildauflösung angezeigt, um dem Benutzer sofortiges Feedback zu geben. Dies ist der Fall, wenn eine Anwendung die Qualität des Entwurfsmodus anfordern würde, daher sollte dies sehr schnell sein. Wenn der Benutzer alle Änderungen vorgenommen, sie im Entwurfsmodus in der Vorschau angezeigt und sich entschieden hat, das vollständige Bild mit den aktuellen Einstellungen zu decodieren, fordert die Anwendung eine Best Quality-Decodierung an. Dies wird in der Regel auch zum Drucken angefordert. Wenn ein angemessener Kompromiss zwischen Geschwindigkeit und Qualität erforderlich ist, fordert die Anwendung Normal Quality an.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback registriert eine Rückruffunktion, damit der Decoder aufruft, wenn sich einer der Raw-Verarbeitungsparameter ändert. Die Signatur für IWICDevelopRawNotificationCallback verfügt nur über eine Methode namens Notify. Notify verfügt über einen einzelnen Parameter, bei dem es sich um eine Maske handelt, die angibt, welche der Rohverarbeitungsparameter geändert wurden.

HRESULT Notify ( UINT NotificationMask );

Ein OR-Vorgang wird für die folgenden Werte für notificationMask ausgeführt.

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

Referenz

IWICDevelopRaw

Konzept

Implementieren von IWICBitmapSourceTransform

Implementieren eines WIC-Enabled Encoders

Schreiben eines WIC-Enabled CODEC

Windows Übersicht über Bildverarbeitungskomponenten