实现 IWICDevelopRaw

IWICDevelopRaw

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

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

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

IWICDevelopRaw 接口的主要用途是使应用程序开发人员能够生成用户界面,以便调整原始参数,这些参数可在不同的编解码器中尽可能一致地工作。 假设最终用户将使用滑块控件调整参数,其最小值和最大值映射到参数的最小和最大范围。 为此,应尽一切努力将所有参数范围视为线性。 为了确保滑块控件不过于敏感,还应为每个参数支持尽可能广泛的范围,至少覆盖最大可能范围的 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 值、预设命名值还是作为 Kelvin 值。 凯尔文的可接受范围是 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 电源函数来实现, (具有 unity 增益的线性功率函数) 。 随着伽玛的增大而增加亮度,随着 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 指定要应用的色调曲线。 假设点之间的线性内插。 pToneCurveWICRawToneCurve 结构,其中包含 WICRawToneCurvePoint 结构的数组,以及数组中点数的计数。

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

WICRawToneCurvePoint 包含输入值和输出值。

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

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

Set/GetRotation

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

Set/GetRenderMode

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

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback 注册解码器的回调函数,以便在任何原始处理参数发生更改时调用。 IWICDevelopRawNotificationCallback 的签名只有一种称为 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 CODEC

Windows映像组件概述