Share via


Implementieren von IWICDevelopRaw

IWICDevelopRaw

Die IWICDevelopRaw-Schnittstelle macht Verarbeitungsoptionen verfügbar, die speziell für die Rohbildverarbeitung gelten. Alle Rohcodecs müssen die IWICDevelopRaw-Schnittstelle unterstützen. Einige unformatierte 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. Mindestens muss jeder Rohcodec die Methoden SetRotation und SetRenderMode implementieren.

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

Einstellungen, die mithilfe der IWICDevelopRaw-Methoden festgelegt werden, sollten vom 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 niemals überschreiben. Indem Sie die Metadaten beibehalten und LoadParameterSet und GetCurrentParameterSet implementieren, ermöglichen Sie Anwendungen für die Rohverarbeitung das Abrufen und Anwenden von Verarbeitungseinstellungen über Sitzungen hinweg.

Ein Standard Zweck der IWICDevelopRaw-Schnittstelle besteht darin, Anwendungsentwicklern das Erstellen einer Benutzeroberfläche zum Anpassen von Rohparametern zu ermöglichen, die so konsistent wie möglich über verschiedene Codecs hinweg funktioniert. Angenommen, ein Endbenutzer passt die Parameter mithilfe eines Schiebereglersteuerelements an, dessen Mindest- und Maximalwerte den Minimal- und Maximalbereichen für den Parameter zugeordnet sind. Um dies zu unterstützen, sollten Sie alle Anstrengungen unternehmen, um alle Parameterbereiche als linear zu behandeln. Um sicherzustellen, dass die Schieberegler nicht übermäßig empfindlich sind, sollten Sie auch einen möglichst breiten Bereich für jeden Parameter unterstützen, der mindestens 50 Prozent des maximal möglichen Bereichs abdeckt. Wenn beispielsweise der maximal mögliche Kontrastbereich von reinem Grau bis reinem Schwarzweiß ist und der Standardwert auf 0,0 zugeordnet wird, liegt der von einem Codec unterstützte Mindestbereich zwischen dem Standardwert und dem reinen Grau am unteren Ende (–1,0) mindestens halbwegs zwischen dem Standardwert und reinem Schwarz und Weiß am unteren 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 der unterstützten Funktionen für diese Rohdatei 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 wird wie folgt definiert:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

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

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

Mit LoadParameterSet kann der Benutzer angeben, ob As Shot-Einstellungen verwendet, vom Benutzer angepasste Einstellungen verwendet oder der Decoder aufgefordert werden soll, das Bild automatisch zu korrigieren.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet gibt einen IPropertyBag2-Wert mit dem aktuellen Parametersatz zurück. Der Aufrufer kann dann diesen Parameter an den Encoder übergeben, der als Encoderoptionen verwendet werden soll.

Set/GetExposureCompensation

GetExposureCompensation und SetExposureCompensation geben die Belichtungskompensation an, die auf die endgültige Ausgabe angewendet werden soll. Der gültige Bereich für EV beträgt –5,0 bis +5,0 Stopps.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Diese Funktionen bieten alle Möglichkeiten, den Weißpunkt abzurufen und festzulegen, entweder als RGB-Wert, als voreingestellter benannter Wert oder als Kelvin-Wert. Der akzeptable Bereich für Kelvin beträgt 1.500 – 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, wobei der Standardkontrast 0,0 ist.

Set/GetGamma

GetGamma und SetGamma geben das anzuwendende Gamma an. Der gültige Bereich für Gamma ist 0,2 bis 5,0, wobei 1,0 der Standardwert ist. Gamma wird in der Regel mithilfe der herkömmlichen Gamma-Leistungsfunktion (eine lineare Leistungsfunktion mit Unity Gain) implementiert. Die Helligkeit wird mit zunehmendem Gamma erhöht und verringert, wenn Sich Gamma 0 nähert. (Beachten Sie, dass der Mindestwert ungleich 0 ist, da null bei herkömmlichen Gamma-Berechnungen zu einem Divid-by-Zero-Fehler führen würde. Das logische Mindestlimit ist 1/max, weshalb das Minimum 0,2 ist.)

Set/GetSharpness

GetSharpness und SetSharpness geben den Umfang der zu übernehmenden Schärfe an. Der gültige Bereich ist –1,0 bis +1,0, wobei 0,0 die Standardmenge der Schärfe ist, und –1,0, der überhaupt keine Schärfe angibt.

Set/GetSaturation

GetSaturation und SetSaturation geben an, wie viel Sättigung angewendet werden soll. Der gültige Bereich zum Angeben der Sättigung ist –1,0 bis +1,0, wobei 0,0 die normale Sättigung, -1,0 die vollständige Entsättigung und +1,0 die vollständige Sättigung darstellt.

Set/GetTint

GetTint und SetTint geben die zu übernehmende Tönung für eine Grüne/Magenta-Neigung an. Der gültige Bereich ist –1,0 bis +1,0, wobei Grün auf der negativen Seite der Skala und Magenta auf der positiven Seite liegt. Die Farbskala ist als orthogonal zur Farbtemperatur definiert.

Set/GetNoiseReduction

GetNoiseReduction und SetNoiseReduction geben an, wie viel Rauschunterdrückung angewendet werden soll. Der gültige Bereich für ist –1,0 bis +1,0, wobei 0,0 die Standardmenge der Rauschunterdrückung angibt, –1,0, der keine Rauschunterdrückung angibt, und +1,0, das die maximale Rauschunterdrückung angibt.

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. Nehmen Sie die lineare Interpolation zwischen Punkten an. Der pToneCurve ist eine WICRawToneCurve-Struktur , die ein Array von WICRawToneCurvePoint-Strukturen und eine Anzahl der Punkte im Array enthält.

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

Ein WICRawToneCurvePoint enthält einen Eingabe- 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 den WICRawToneCurve im pcbActualToneCurveBufferSize-Parameter zurückgeben.

Set/GetRotation

GetRotation und SetRotation geben den Grad der Anzuwendenden Drehung an. Eine Drehung von 90,0 würde eine Drehung um 90 Grad im Uhrzeigersinn angeben. (Der Unterschied zwischen der Verwendung von SetRotation und der Einstellungsrotation mit der CopyPixels-Methode besteht darin, dass der mit SetRotation festgelegte Drehwinkel vom Codec beibehalten werden soll, während das Festlegen der Drehung durch CopyPixels nur das Bild im Arbeitsspeicher rotiert.

Set/GetRenderMode

GetRenderMode und SetRenderMode geben das Qualitätsniveau der Ausgabe an, die der Aufrufer benötigt. Wenn ein Benutzer Parameter anpasst, 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 mit einer Bildschirmauflösung oder weniger angezeigt, anstatt mit der tatsächlichen Bildauflösung, um dem Benutzer ein sofortiges Feedback zu geben. Dies ist der Zeitpunkt, an dem 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 beschlossen hat, das vollständige Bild mit den aktuellen Einstellungen zu decodieren, fordert die Anwendung eine Decodierung von bester Qualität an. Dies wird in der Regel auch für den Druck 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 für den Decoder, der aufgerufen werden soll, wenn sich einer der Raw-Verarbeitungsparameter ändert. Die Signatur für den IWICDevelopRawNotificationCallback weist nur eine Methode namens Notify auf. Notify verfügt über einen einzelnen Parameter. Hierbei handelt es sich um eine Maske, die angibt, welche der Rohverarbeitungsparameter geändert wurden.

HRESULT Notify ( UINT NotificationMask );

Ein OR-Vorgang wird für die folgenden Werte für die 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

Übersicht über die Windows-Bildverarbeitungskomponente