Реализация IWICDevelopRaw

IWICDevelopRaw

Интерфейс IWICDevelopRaw предоставляет параметры обработки, относящиеся к обработке необработанных изображений. Все необработанные кодеки должны поддерживать интерфейс IWICDevelopRaw . Некоторые необработанные кодеки могут не поддерживать все параметры, предоставляемые этим интерфейсом, но следует поддерживать все параметры, которые может выполнять кодек. Как минимум, каждый необработанный кодек должен реализовывать методы SetRotation и SetRenderMode .

Кроме того, некоторые методы и интерфейсы, которые являются необязательными для других кодеков, настоятельно рекомендуется использовать для необработанных кодеков. К ним относятся методы GetPreview и GetThumbnail в классе декодера на уровне контейнера и интерфейс IWICBitmapSourceTransform в классе decode на уровне кадра.

Параметры, заданные с помощью методов IWICDevelopRaw , должны сохраняться кодеком в соответствии с способом сохранения других метаданных, но никогда не следует перезаписывать исходные параметры "Как снимок". Сохраняя метаданные и реализуя LoadParameterSet и GetCurrentParameterSet, вы позволяете приложениям необработанной обработки получать и применять параметры обработки в сеансах.

Main целью интерфейса 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/GetExposure Compensationion

GetExposureCompensation и SetExposure Compensationion указывают компенсацию экспозиции, применяемую к окончательным выходным данным. Допустимый диапазон для EV — от –5,0 до +5,0 остановок.

Set/GetCurrentParameterRGB, Set/GetNamedWhitePoint, Set/GetwhitePointKelvin

Все эти функции предоставляют способы получения и задания белой точки в виде RGB-значения, предустановленного именованного значения или значения Кельвина. Допустимый диапазон для Кельвина — 1500–30 000.

Set/GetContrast

GetContrast и SetContrast указывают контрастность, применяемую к выходным данным. Допустимый диапазон для указания контрастности — от –1,0 до +1,0, а контраст по умолчанию — 0,0.

Set/GetGamma

GetGamma и SetGamma указывают применяемую гамму. Допустимый диапазон для Гамма — от 0,2 до 5,0, по умолчанию — 1,0. Гамма обычно реализуется с помощью традиционной гамма-функции питания (линейная энергетическая функция с увеличением единства). Яркость увеличивается с увеличением гамма и уменьшается по мере приближения гамма к нулю. (Обратите внимание, что минимальное значение не равно нулю, так как ноль приведет к ошибке деления на ноль в традиционных гамма-вычислениях. Логическое минимальное ограничение — 1/max, поэтому минимальное — 0,2.)

Set/GetSharpness

GetSharpness и SetSharpness указывают объем применения резкости. Допустимый диапазон — от –1,0 до +1,0, при этом значение по умолчанию равно 0,0, а значение –1,0 означает отсутствие резкости.

Set/GetSaturation

GetSaturation и SetSaturation указывают объем насыщенности для применения. Допустимый диапазон для указания насыщенности — от –1,0 до +1,0, при этом 0,0 — это обычная насыщенность, –1,0 — полная денасыщенность, а +1,0 — полная насыщенность.

Set/GetTint

GetTint и SetTint указывают на применяемый оттенок на зеленом/пурпурном смещении. Допустимый диапазон — от –1,0 до +1,0, зеленый — на отрицательной стороне шкалы, а пурпурный — на положительной. Шкала оттенков определяется как ортогональная по цветовой температуре.

Set/GetNoiseReduction

GetNoiseReduction и SetNoiseReduction указывают уровень снижения шума для применения. Допустимый диапазон : от –1,0 до +1,0, при этом значение 0,0 указывает на уровень снижения шума по умолчанию, –1,0 — отсутствие снижения шума, а +1,0 — максимальное снижение шума.

SetDestinationColorContext

SetDestinationColorContext указывает цветовой профиль, применяемый к изображению. Для получения текущего цветового профиля можно вызвать Метод GetColorContexts .

Set/GetToneCurve

GetToneCurve и SetToneCurve указывают кривую тона для применения. Предполагайте линейную интерполяцию между точками. PToneCurve — это структура WICRawToneCurve, которая содержит массив структур WICRawToneCurvePoint и количество точек в массиве.

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

WICRawToneCurvePoint содержит входное и выходное значение.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Когда вызывающий объект передает значение NULL в параметре pToneCurve , необходимо передать требуемый размер для WICRawToneCurve в параметре pcbActualToneCurveBufferSize .

Set/GetRotation

GetRotation и SetRotation указывают степень поворота для применения. Поворот 90,0 определяет поворот на 90 градусов по часовой стрелке. (Разница между использованием SetRotation и настройкой поворота с помощью метода CopyPixels заключается в том, что угол поворота, заданный с помощью SetRotation , должен сохраняться кодеком, а установка поворота с помощью CopyPixels поворачивает только изображение в памяти.

Set/GetRenderMode

GetRenderMode и SetRenderMode указывают уровень качества выходных данных, необходимый вызывающей объекту. Когда пользователь настраивает параметры, приложение должно отображать очень быстрое приближение того, как будет выглядеть фактическое изображение при применении изменений. Для этой цели изображение обычно отображается в разрешении экрана или в меньшем, а не фактическом разрешении изображения, чтобы предоставить пользователю немедленную обратную связь. Это когда приложение запрашивает качество режима черновика, поэтому это должно быть очень быстро. Когда пользователь вносил все изменения, просматривал их в режиме черновика и решил декодировать полное изображение с текущими параметрами, приложение запрашивает декодирование наилучшего качества. Обычно это также запрашивается для печати. Если требуется разумный компромисс между скоростью и качеством, приложение запрашивает нормальное качество.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback регистрирует функцию обратного вызова, которую декодер вызывает при изменении любого из параметров обработки Raw. Подпись для IWICDevelopRawNotificationCallback имеет только один метод, который называется Notify. Notify имеет один параметр, который представляет собой маску, указывающую, какие из необработанных параметров обработки были изменены.

HRESULT Notify ( UINT NotificationMask );

Операция OR выполняется со следующими значениями для 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

Reference

IWICDevelopRaw

Основные понятия

Реализация IWICBitmapSourceTransform

Реализация кодировщика WIC-Enabled

Написание кодека WIC-Enabled

Общие сведения о компоненте обработки образов Windows