Implementación de IWICDevelopRaw

IWICDevelopRaw

La interfaz IWICDevelopRaw expone opciones de procesamiento específicas del procesamiento de imágenes sin procesar. Todos los códecs sin formato deben admitir la interfaz IWICDevelopRaw . Es posible que algunos códecs sin formato no puedan admitir todas las configuraciones expuestas por esta interfaz, pero debe admitir todas las configuraciones que el códec es capaz de realizar. Como mínimo, cada códec sin formato debe implementar los métodos SetRotation y SetRenderMode .

Además, algunos métodos e interfaces que son opcionales para otros códecs son muy recomendables para códecs sin formato. Estos incluyen los métodos GetPreview y GetThumbnail en la clase de descodificador de nivel de contenedor y la interfaz IWICBitmapSourceTransform en la clase de descodificación de nivel de marco.

La configuración establecida mediante los métodos IWICDevelopRaw debe conservarse mediante el códec de una manera coherente con la forma en que se conservan otros metadatos, pero nunca debe sobrescribir la configuración original "As Shot". Al conservar los metadatos e implementar LoadParameterSet y GetCurrentParameterSet, permite que las aplicaciones de procesamiento sin procesar recuperen y apliquen la configuración de procesamiento entre sesiones.

Un propósito principal de la interfaz IWICDevelopRaw es permitir que los desarrolladores de aplicaciones creen una interfaz de usuario para ajustar los parámetros sin procesar que funcionarán lo más coherente posible en diferentes códecs. Supongamos que un usuario final ajustará los parámetros mediante un control deslizante, con sus valores mínimos y máximos asignados a los intervalos mínimo y máximo del parámetro. Para admitir esto, debe realizar todos los esfuerzos para tratar todos los intervalos de parámetros como lineales. Para asegurarse de que los controles deslizantes no son demasiado sensibles, también debe admitir un rango tan amplio como sea posible para cada parámetro, cubriendo al menos el 50 por ciento del intervalo máximo posible. Por ejemplo, si el intervalo máximo posible de contraste es de gris puro a blanco y negro puro, con el valor predeterminado asignado a 0,0, el intervalo mínimo admitido por un códec sería de al menos a medio camino entre el valor predeterminado y el gris puro en el extremo inferior (–1,0), hasta al menos medio camino entre el valor predeterminado y el blanco puro en el extremo superior (+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 devuelve el conjunto de funcionalidades admitidas para este archivo sin formato. La estructura WICRawCapabilitiesInfo se define de la siguiente manera:

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

La enumeración WICRawCapabilities usada en esta estructura se define como:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

El campo final es una enumeración WICRawRotationCapabilities , definida como:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet permite al usuario especificar si se debe usar la configuración De captura, usar la configuración ajustada por el usuario o solicitar al descodificador que corrija automáticamente la imagen.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet devuelve un IPropertyBag2 con el conjunto de parámetros actual. A continuación, el autor de la llamada puede pasar este parámetro establecido al codificador para usarlo como opciones del codificador.

Set/GetExposureCompensation

GetExposureCompensation y SetExposureCompensation indican la compensación de exposición que se aplicará a la salida final. El intervalo válido para EV es de –5,0 a +5,0 paradas.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Estas funciones proporcionan formas de obtener y establecer el punto blanco, ya sea como un valor RGB, un valor preestablecido denominado o como un valor Kelvin. El intervalo aceptable para Kelvin es de 1500 a 30 000.

Set/GetContrast

GetContrast y SetContrast indican la cantidad de contraste que se va a aplicar a la salida. El intervalo válido para especificar el contraste es –1.0 a +1.0, con el contraste predeterminado 0,0.

Set/GetGamma

GetGamma y SetGamma indican la gamma que se va a aplicar. El intervalo válido para Gamma es de 0,2 a 5,0, siendo 1,0 el valor predeterminado. Gamma normalmente se implementa mediante la función tradicional de potencia Gamma (una función de potencia lineal con ganancia de unidad). El brillo aumenta con el aumento de Gamma y disminuye a medida que Gamma se aproxima a cero. (Tenga en cuenta que el valor mínimo es distinto de cero, ya que cero provocaría un error de división por cero en los cálculos gamma tradicionales. El límite mínimo lógico es 1/max, por lo que el mínimo es 0,2).

Set/GetSharpness

GetSharpness y SetSharpness indican la cantidad de afilamiento que se va a aplicar. El intervalo válido es –1,0 a +1,0, siendo 0,0 la cantidad predeterminada de afilamiento y –1,0 que indica que no hay nitidez en absoluto.

Set/GetSaturation

GetSaturation y SetSaturation indican la cantidad de saturación que se va a aplicar. El intervalo válido para especificar la saturación es –1,0 a +1,0, siendo 0,0 saturación normal, –1,0 que representa la desaturación completa y +1,0 que representa la saturación completa.

Set/GetTint

GetTint y SetTint indican el tono que se va a aplicar, en un sesgo verde/magenta. El intervalo válido es –1,0 a +1,0, con verde en el lado negativo de la escala y magenta en el positivo. La escala de tono se define como ortogonal a temperatura de color.

Set/GetNoiseReduction

GetNoiseReduction y SetNoiseReduction indican la cantidad de reducción de ruido que se va a aplicar. El intervalo válido para es –1,0 a +1,0, con 0,0 que indica la cantidad predeterminada de reducción de ruido, –1,0 que indica ninguna reducción de ruido y +1,0 que indica la reducción máxima del ruido.

SetDestinationColorContext

SetDestinationColorContext especifica el perfil de color que se va a aplicar a la imagen. Puede llamar a GetColorContexts para recuperar el perfil de color actual.

Set/GetToneCurve

GetToneCurve y SetToneCurve especifican la curva de tono que se va a aplicar. Supongamos la interpolación lineal entre puntos. PToneCurve es una estructura WICRawToneCurve, que contiene una matriz de estructuras WICRawToneCurvePoint y un recuento del número de puntos de la matriz.

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

WiCRawToneCurvePoint contiene un valor de entrada y un valor de salida.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Cuando el autor de la llamada pasa NULL en el parámetro pToneCurve , debe devolver el tamaño necesario para WICRawToneCurve en el parámetro pcbActualToneCurveBufferSize .

Set/GetRotation

GetRotation y SetRotation indican el grado de rotación que se va a aplicar. Un giro de 90,0 especificaría un giro de 90 grados en el sentido de las agujas del reloj. (La diferencia entre usar SetRotation y establecer la rotación mediante el método CopyPixels es que el códec debe conservar el ángulo de rotación mediante SetRotation , mientras que al establecer la rotación a través de CopyPixels solo gira la imagen en memoria.

Set/GetRenderMode

GetRenderMode y SetRenderMode indican el nivel de calidad de salida que requiere el autor de la llamada. Cuando un usuario ajusta los parámetros, la aplicación debe mostrar una aproximación muy rápida del aspecto que tendrá la imagen real si se aplican los cambios. Para este propósito, la imagen se suele mostrar en la resolución de pantalla o menos, en lugar de la resolución de imagen real, para proporcionar comentarios inmediatos al usuario. Esto es cuando una aplicación solicitaría la calidad del modo borrador, por lo que esto debería ser muy rápido. Cuando el usuario ha realizado todos los cambios, los previsualizó en modo borrador y decidió descodificar la imagen completa con la configuración actual, la aplicación solicita un descodificación de mejor calidad. Normalmente, esto también se solicita para imprimir. Cuando se requiere un equilibrio razonable entre la velocidad que requiere una calidad, la aplicación solicita la calidad normal.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback registra una función de devolución de llamada para que el descodificador llame cuando cambie cualquiera de los parámetros de procesamiento sin procesar. La firma del IWICDevelopRawNotificationCallback solo tiene un método, denominado Notify. Notify tiene un único parámetro, que es una máscara que indica cuál de los parámetros de procesamiento sin procesar ha cambiado.

HRESULT Notify ( UINT NotificationMask );

Se realiza una operación OR en los siguientes valores para 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

Referencia

IWICDevelopRaw

Conceptual

Implementación de IWICBitmapSourceTransform

Implementación de un codificador de WIC-Enabled

Cómo escribir un CÓDEC de WIC-Enabled

Información general sobre el componente de creación de imágenes de Windows