Udostępnij za pośrednictwem


Implementacja IWICDevelopRaw

IWICDevelopRaw

Interfejs IWICDevelopRaw uwidacznia opcje przetwarzania specyficzne dla nieprzetworzonego przetwarzania obrazów. Wszystkie nieprzetworzone kodeki muszą obsługiwać interfejs IWICDevelopRaw. Niektóre surowe kodeki mogą nie być w stanie obsłużyć wszystkich ustawień dostępnych poprzez ten interfejs, ale należy obsługiwać wszystkie ustawienia, które Twój kodek jest w stanie obsługiwać. Co najmniej każdy pierwotny koder kodu musi implementować metody SetRotation i SetRenderMode.

Ponadto niektóre metody i interfejsy opcjonalne dla innych koderów są zdecydowanie zalecane w przypadku koderów pierwotnych. Należą do nich metody GetPreview i GetThumbnail klasy dekodera na poziomie kontenera oraz interfejs IWICBitmapSourceTransform klasy dekodowania na poziomie ramki.

Ustawione przy użyciu metod IWICDevelopRaw ustawienia powinny być zachowywane przez kodek w sposób zgodny z metodą utrwalania innych metadanych, ale nigdy nie należy zastępować oryginalnych ustawień "As Shot". Utrwalając metadane i implementując LoadParameterSet oraz GetCurrentParameterSet, umożliwiasz aplikacjom do surowego przetwarzania pobieranie i stosowanie ustawień przetwarzania pomiędzy sesjami.

Głównym celem interfejsu IWICDevelopRaw jest umożliwienie deweloperom aplikacji tworzenia interfejsu użytkownika do dostosowywania nieprzetworzonych parametrów, które będą działać tak spójnie, jak to możliwe w różnych koderach. Załóżmy, że użytkownik końcowy będzie dostosowywał parametry za pomocą kontrolki suwaka, który ma wartości minimalne i maksymalne zamapowanymi na minimalne i maksymalne zakresy parametru. Aby to umożliwić, należy podjąć wszelkie wysiłki, aby traktować wszystkie zakresy parametrów jako liniowe. Aby upewnić się, że kontrolki suwaka nie są zbyt wrażliwe, należy również obsługiwać możliwie najszerszy zakres dla każdego parametru, obejmujący co najmniej 50 procent maksymalnego możliwego zakresu. Jeśli na przykład maksymalny możliwy zakres kontrastu wynosi od czystej szarości do czystej czerni i bieli, a wartość domyślna jest mapowana na 0,0, minimalny zakres obsługiwany przez koder koderowy będzie z co najmniej połowy drogi między wartością domyślną a czystą szarością na niskim końcu (–1,0), do co najmniej połowy wartości domyślnej i czystej czarnej i białej na wysokim końcu (+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 zwraca zestaw obsługiwanych możliwości dla tego nieprzetworzonego pliku. Struktura WICRawCapabilitiesInfo jest zdefiniowana w następujący sposób:

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

Wyliczenie WICRawCapabilities używane w tej strukturze jest definiowane jako:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

Ostatnie pole to WICRawRotationCapabilities wyliczenie zdefiniowane jako:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet umożliwia użytkownikowi określenie, czy mają być używane ustawienia As Shot, ustawienia dostosowane przez użytkownika, czy poproszenie dekodera o automatyczne poprawienie obrazu.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

PobierzAktualnyZestawParametrów

GetCurrentParameterSet zwraca IPropertyBag2 z bieżącym zestawem parametrów. Obiekt wywołujący może następnie przekazać ten zestaw parametrów do kodera, aby użyć go jako opcji kodera.

Ustaw/Pobierz Kompensację Ekspozycji

GetExposureCompensation i SetExposureCompensation wskazują rekompensatę ekspozycji do zastosowania do końcowego wyniku. Prawidłowy zakres dla EV wynosi od –5,0 do +5,0 stopów.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Te funkcje zapewniają sposoby uzyskiwania i ustawiania punktu bieli jako wartości RGB, wstępnie ustawionej nazwanej wartości lub wartości w Kelvinach. Dopuszczalny zakres dla Kelvin wynosi 1500 – 30 000.

Ustaw/Pobierz Kontrast

GetContrast oraz SetContrast wskazują ilość kontrastu do zastosowania w wyjściu. Prawidłowy zakres do określenia kontrastu to –1.0 do +1.0, a domyślny kontrast wynosi 0,0.

Set/GetGamma

GetGamma i SetGamma wskazują gamma do zastosowania. Prawidłowy zakres gamma to od 0,2 do 5,0, a wartość domyślna to 1,0. Gamma zwykle implementuje się przy użyciu tradycyjnej funkcji potęgowej Gamma (funkcji potęgowej liniowej z wzmocnieniem równym jeden). Jasność zwiększa się wraz ze wzrostem Gamma i zmniejsza się, gdy gamma zbliża się do zera. (Należy pamiętać, że wartość minimalna jest inna niż zero, ponieważ zero spowodowałoby błąd dzielenia przez zero w tradycyjnych obliczeniach Gamma. Minimalny limit logiczny wynosi 1/maksimum, dlatego wartość minimalna wynosi 0,2).

Set/GetSharpness

GetSharpness i SetSharpness określają ilość wyostrzenia do zastosowania. Prawidłowy zakres to –1.0 do +1.0, z wartością 0,0 jest domyślną ilością wyostrzenia i –1,0 wskazującą na brak wyostrzenia.

Ustaw/Pobierz nasycenie

GetSaturation i SetSaturation wskazują ilość nasycenia do zastosowania. Prawidłowy zakres do określenia nasycenia to –1.0 do +1.0, a 0,0 to normalne nasycenie, –1,0 reprezentujące pełne nasycenie i +1.0 reprezentujące pełne nasycenie.

Ustaw/PobierzOdcień (Set/GetTint)

GetTint i SetTint wskazują odcień do zastosowania, na odchyleniu zielonym/magenta. Prawidłowy zakres to –1.0 do +1.0, a zielony znajduje się po stronie ujemnej skali, a magenta po stronie dodatniej skali. Skala odcieni jest definiowana jako ortogonalna do temperatury koloru.

Ustaw/PobierzRedukcjaSzumu

GetNoiseReduction i SetNoiseReduction wskazują, jaką ilość redukcji szumu należy zastosować. Prawidłowy zakres to –1.0 do +1.0, z wartością 0,0 wskazującą domyślną ilość redukcji szumu, –1.0 wskazującą brak redukcji szumu i +1.0 wskazującą maksymalną redukcję szumu.

SetDestinationColorContext

SetDestinationColorContext określa profil kolorów, który ma być stosowany do obrazu. Aby pobrać bieżący profil kolorów, możesz wywołać GetColorContexts.

Konfiguruj/Ustaw Krzywą Tonalną

GetToneCurve i SetToneCurve określają krzywą tonu, którą należy zastosować. Przyjmij interpolację liniową między punktami. Struktura pToneCurve to struktura WICRawToneCurve, która zawiera tablicę ze strukturami WICRawToneCurvePoint oraz liczbę punktów w tej tablicy.

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

WICRawToneCurvePoint zawiera wartość wejściową i wartość wyjściową.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Gdy obiekt wywołujący przekazuje NULL w parametrze pToneCurve, należy przekazać z powrotem wymagany rozmiar dla WICRawToneCurve w parametrze pcbActualToneCurveBufferSize.

Ustaw/PobierzRotację

GetRotation i SetRotation wskazują stopień rotacji do zastosowania. Obrót 90,0 określa rotację 90 stopni zgodnie z ruchem wskazówek zegara. (Różnica między użyciem SetRotation a ustawieniem obrotu przy użyciu metody CopyPixels polega na tym, że kąt obrotu przy użyciu SetRotation powinien być utrwalany przez kodek, podczas gdy ustawienie obrotu przez CopyPixels obraca tylko obraz w pamięci.

Set/GetRenderMode

GetRenderMode i SetRenderMode wskazują poziom jakości danych wyjściowych, których wymaga obiekt wywołujący. Gdy użytkownik dostosowuje parametry, aplikacja powinna wyświetlić bardzo szybkie przybliżenie tego, jak będzie wyglądał rzeczywisty obraz, jeśli zmiany zostaną zastosowane. W tym celu obraz jest zwykle wyświetlany w rozdzielczości ekranu lub mniejszej, a nie rzeczywistej rozdzielczości obrazu, w celu natychmiastowego przekazania opinii użytkownikowi. Dzieje się tak, gdy aplikacja zażąda jakości trybu szkicowego, więc powinno to być bardzo szybkie. Gdy użytkownik wprowadził wszystkie zmiany, wyświetlił podgląd w trybie roboczym i postanowił zdekodować pełny obraz przy użyciu bieżących ustawień, aplikacja żąda dekodowania najlepszej jakości. Zwykle jest to również wymagane do drukowania. W przypadku, gdy wymagana jest rozsądna równowaga między szybkością a jakością, aplikacja żąda normalnej jakości.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback rejestruje funkcję wywołania zwrotnego, którą dekoder wywołuje w przypadku zmiany dowolnego z parametrów przetwarzania surowego. Podpis IWICDevelopRawNotificationCallback ma tylko jedną metodę o nazwie Notify. Notify ma jeden parametr, który jest maską wskazującą, które z parametrów przetwarzania pierwotnego uległy zmianie.

HRESULT Notify ( UINT NotificationMask );

Operacja OR jest wykonywana na następujących wartościach dla maski powiadomień.

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

Referencyjne

IWICDevelopRaw

Koncepcja

implementowanie IWICBitmapSourceTransform

Implementacja kodera WIC-Enabled

Jak napisać CODEC WIC-Enabled

Składnik programu Windows Imaging — omówienie