实现 IWICDevelopRaw

IWICDevelopRaw

IWICDevelopRaw 接口公开特定于原始图像处理的处理选项。 所有原始编解码器都必须支持 IWICDevelopRaw 接口。 某些原始编解码器可能无法支持此接口公开的每个设置,但你应该支持编解码器能够执行的所有设置。 每个原始编解码器至少必须实现 SetRotationSetRenderMode 方法。

此外,对于原始编解码器,强烈建议使用一些对于其他编解码器可选的方法和接口。 其中包括容器级解码器类上的 GetPreviewGetThumbnail 方法,以及帧级解码类上的 IWICBitmapSourceTransform 接口。

使用 IWICDevelopRaw 方法设置的设置应由编解码器以与其他元数据的保留方式一致的方式进行保留,但不应覆盖原始的“作为拍摄”设置。 通过保留元数据并实现 LoadParameterSetGetCurrentParameterSet,可以让原始处理应用程序跨会话检索和应用处理设置。

IWICDevelopRaw 接口的一个main用途是,使应用程序开发人员能够构建一个用户界面,用于调整原始参数,以便在不同编解码器之间尽可能一致地工作。 假设最终用户将使用滑块控件调整参数,其最小值和最大值映射到参数的最小值和最大值范围。 为了支持这一点,应尽一切努力将所有参数范围视为线性。 为了确保滑块控件不会过于敏感,还应为每个参数支持尽可能广泛的范围,至少涵盖最大可能范围的 50%。 例如,如果最大可能的对比度范围从纯灰色到纯黑白,默认值映射到 0.0,则编解码器支持的最小范围至少介于默认值与低端纯灰色 (–1.0) 之间的一半,到默认值与高端纯黑白之间的至少一半 (+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 返回此原始文件支持的一组功能。 WICRawCapabilitiesInfo 结构定义如下:

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

此结构中使用的 WICRawCapabilities 枚举定义为:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

最后一个字段是 WICRawRotationCapabilities 枚举,定义为:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet 使用户能够指定是使用“作为快照”设置、使用用户调整的设置,还是请求解码器自动更正图像。

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

GetCurrentParameterSet

GetCurrentParameterSet 返回具有当前参数集的 IPropertyBag2 。 然后,调用方可以将此参数集传递给编码器,以用作编码器选项。

Set/GetExposureCompensation

GetExposureCompensationSetExposureCompensation 指示要应用于最终输出的曝光补偿。 EV 的有效范围是 –5.0 到 +5.0 停止。

Set/GetCurrentParameterRGB、Set/GetNamedWhitePoint、Set/GetwhitePointKelvin

这些函数都提供了获取和设置白点的方法,可以是 RGB 值、命名值的预设值或开氏度值。 开尔文的可接受范围是 1,500 – 30,000。

Set/GetContrast

GetContrastSetContrast 指示要应用于输出的对比度。 要指定对比度的有效范围是 –1.0 到 +1.0,默认对比度为 0.0。

Set/GetGamma

GetGammaSetGamma 指示要应用的 Gamma。 Gamma 的有效范围是 0.2 到 5.0,默认值为 1.0。 Gamma 通常使用传统的 Gamma 功率函数实现, (具有单位增益) 的线性功率函数。 亮度随伽玛的增大而增加,当伽玛接近零时会降低。 (请注意,最小值为非零,因为在传统的 Gamma 计算中,零将导致除零误差。逻辑最小值限制为 1/max,这就是最小值为 0.2.)

Set/GetSharpness

GetSharpnessSetSharpness 指示要应用的锐化量。 有效范围是 –1.0 到 +1.0,其中 0.0 是默认的锐化量,而 –1.0 表示根本没有锐化。

Set/GetSaturation

GetSaturationSetSaturation 指示要应用的饱和度量。 指定饱和度的有效范围为 –1.0 到 +1.0,其中 0.0 表示正常饱和度,–1.0 表示完全饱和度,+1.0 表示完全饱和度。

Set/GetTint

GetTintSetTint 指示在绿色/洋红色偏差上应用的色调。 有效范围为 –1.0 到 +1.0,绿色位于刻度的负端,洋红色位于正值。 色调刻度定义为与色温正交。

Set/GetNoiseReduction

GetNoiseReductionSetNoiseReduction 指示要应用的降噪量。 的有效范围为 –1.0 到 +1.0,其中 0.0 表示默认降噪量,–1.0 表示无降噪,+1.0 表示最大降噪。

SetDestinationColorContext

SetDestinationColorContext 指定要应用于图像的颜色配置文件。 可以调用 GetColorContexts 来检索当前颜色配置文件。

Set/GetToneCurve

GetToneCurveSetToneCurve 指定要应用的音调曲线。 假设点之间的线性内插。 pToneCurve 是一个 WICRawToneCurve 结构,它包含 WICRawToneCurvePoint 结构的数组,以及数组中点数的计数。

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

WICRawToneCurvePoint 包含输入值和输出值。

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

当调用方在 pToneCurve 参数中传递 NULL 时,您应该在 pcActualToneCurveBufferSize 参数中传回 WICRawToneCurve 的所需大小。

Set/GetRotation

GetRotationSetRotation 指示要应用的旋转程度。 旋转 90.0 将指定顺时针旋转 90 度。 (使用 SetRotation 和使用 CopyPixels 方法设置旋转的区别在于,使用 SetRotation 设置的旋转角度应由编解码器保留,而通过 CopyPixel 设置 旋转只会旋转内存中的图像。

Set/GetRenderMode

GetRenderModeSetRenderMode 指示调用方所需的输出质量级别。 当用户调整参数时,应用程序应以非常快的速度显示实际图像在应用更改时的外观近似值。 为此,图像通常以屏幕分辨率(而不是实际图像分辨率)显示,以立即向用户提供反馈。 此时,应用程序会请求草稿模式质量,因此速度应非常快。 当用户进行了所有更改,在草稿模式下预览这些更改,并决定使用当前设置解码完整图像时,应用程序会请求最佳质量解码。 打印时通常也要求这样做。 如果需要在速度和质量之间进行合理的权衡,应用程序会请求正常质量。

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback 为解码器注册一个回调函数,以便在任何原始处理参数更改时调用。 IWICDevelopRawNotificationCallback 的签名只有一种称为 Notify 的方法。 Notify 有一个参数,它是一个掩码,指示哪些原始处理参数已更改。

HRESULT Notify ( UINT NotificationMask );

对 NotificationMask 的以下值执行 OR 操作。

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

参考

IWICDevelopRaw

概念性

实现 IWICBitmapSourceTransform

实现WIC-Enabled编码器

如何编写WIC-Enabled编解码器

Windows 映像组件概述