Partilhar via


Implementando o IWICDevelopRaw

IWICDevelopRaw

A interfaceIWICDevelopRaw expõe opções de processamento específicas para o processamento de imagens brutas. Todos os codecs brutos devem suportar a interface IWICDevelopRaw. Alguns codecs brutos podem não ser capazes de suportar todas as configurações expostas por essa interface, mas você deve suportar todas as configurações que seu codec é capaz de executar. No mínimo, cada codec bruto deve implementar os métodos SetRotation e SetRenderMode.

Além disso, alguns métodos e interfaces que são opcionais para outros codecs são altamente recomendados para codecs brutos. Eles incluem os métodos GetPreview e GetThumbnail na classe de descodificador de nível de contentor e a interface IWICBitmapSourceTransform na classe de descodificação de nível de frame.

As configurações definidas usando os métodos IWICDevelopRaw devem ser mantidas pelo codec de forma consistente com a maneira como outros metadados são persistentes, mas você nunca deve substituir as configurações originais "As Shot". Ao persistir os metadados e implementar LoadParameterSet e GetCurrentParameterSet , você permite que aplicativos de processamento bruto recuperem e apliquem configurações de processamento entre sessões.

Um dos principais objetivos da interfaceIWICDevelopRaw é permitir que os desenvolvedores de aplicativos criem uma interface de usuário para ajustar parâmetros brutos que funcionem da forma mais consistente possível em diferentes codecs. Suponha que um usuário final ajustará os parâmetros usando um controle deslizante, com seus valores mínimo e máximo mapeados para os intervalos mínimo e máximo para o parâmetro. Para dar suporte a isso, você deve fazer todos os esforços para tratar todos os intervalos de parâmetros como lineares. Para garantir que os controles deslizantes não sejam excessivamente sensíveis, você também deve oferecer suporte a um intervalo o mais amplo possível para cada parâmetro, cobrindo pelo menos 50% do intervalo máximo possível. Por exemplo, se o intervalo máximo possível de contraste for de cinza puro a preto e branco puro, com o valor padrão sendo mapeado para 0,0, o intervalo mínimo suportado por um codec seria de pelo menos metade do caminho entre o valor padrão e cinza puro na extremidade inferior (–1,0), até pelo menos metade do caminho entre o valor padrão e preto e branco puro na extremidade 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 );
}

ConsultarInformacoesDeCapacidadesBrutas

QueryRawCapabilitiesInfo retorna o conjunto de recursos suportados para esse arquivo bruto. A estrutura WICRawCapabilitiesInfo é definida da seguinte forma:

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

A enumeração WICRawCapabilities usada nesta estrutura é definida como:

enum WICRawCapabilities 
{   
   WICRawCapabilityNotSupported,
   WICRawCapabilityGetSupported,
   WICRawCapabilityFullySupported
}

O campo final é uma enumeração WICRawRotationCapabilities, definida como:

enum WICRawRotationCapabilities                    
{
   WICRawRotationCapabilityNotSupported,
   WICRawRotationCapabilityGetSupported,
   WICRawRotationCapabilityNinetyDegreesSupported
   WICRawRotationCapabilityFullySupported
}

LoadParameterSet

LoadParameterSet permite que o usuário especifique se deseja usar as configurações As Shot, usar configurações ajustadas pelo usuário ou solicitar que o decodificador corrija automaticamente a imagem.

enum WICRawParameterSet
{
   WICAsShotParameterSet,
   WICUserAdjustedParameterSet,
   WICAutoAdjustedParameterSet
}

ObterConjuntoAtualDeParâmetros

GetCurrentParameterSet retorna um IPropertyBag2 com o conjunto de parâmetros atual. O chamador pode então passar esse conjunto de parâmetros para o codificador para usar como as opções do codificador.

Set/GetCompensaçãoExposição

GetExposureCompensation e SetExposureCompensation indicam a compensação de exposição a ser aplicada à saída final. O intervalo válido para EV é de –5,0 a +5,0 pontos.

Set/GetCurrentParameterRGB, set/GetNamedWhitePoint, set/GetwhitePointKelvin

Todas essas funções fornecem maneiras de obter e definir o ponto branco, seja como um valor RGB, um valor nomeado predefinido ou como um valor Kelvin. O intervalo aceitável para Kelvin é de 1.500 – 30.000.

Definir/Obter Contraste

GetContrast e SetContrast indicam a quantidade de contraste a ser aplicada à saída. O intervalo válido para especificar o contraste é –1.0 a +1.0, com o contraste padrão sendo 0.0.

Definir/ObterGamma

GetGamma e SetGamma indicam o Gamma a ser aplicado. O intervalo válido para Gamma é de 0,2 a 5,0, com 1,0 sendo o padrão. Gamma normalmente é implementado usando a função de potência Gamma tradicional (uma função de potência linear com ganho unitário). O brilho aumenta com o aumento da gama e diminui à medida que a gama se aproxima de zero. (Observe que o valor mínimo é diferente de zero, porque zero resultaria em um erro de divisão por zero nos cálculos Gamma tradicionais. O limite mínimo lógico é 1/max, razão pela qual o mínimo é 0,2.)

Definir/Obter Nitidez

GetSharpness e SetSharpness indicam a quantidade de nitidez que deve ser aplicada. O intervalo válido é –1,0 a +1,0, com 0,0 sendo a quantidade padrão de nitidez e –1,0 indicando nenhuma nitidez.

Definir/ObterSaturação

GetSaturation e SetSaturation indicam a quantidade de saturação para aplicar. O intervalo válido para especificar a saturação é –1,0 a +1,0, sendo 0,0 a saturação normal, –1,0 representando a dessaturação completa e +1,0 representando a saturação total.

Definir/GetTint

GetTint e SetTint indicam a tonalidade a ser aplicada, numa tendência verde/magenta. O intervalo válido é de –1,0 a +1,0, com o verde no lado negativo da escala e o magenta no positivo. A escala de tonalidade é definida como ortogonal à temperatura de cor.

Definir/ObterReduçãoDeRuído

GetNoiseReduction e SetNoiseReduction indicam a quantidade de redução de ruído a ser aplicada. O intervalo válido é –1,0 a +1,0, com 0,0 indicando a quantidade padrão de redução de ruído, –1,0 indicando nenhuma redução de ruído e +1,0 indicando redução máxima de ruído.

SetDestinationColorContext

SetDestinationColorContext especifica o perfil de cor a ser aplicado à imagem. Você pode chamar GetColorContexts para recuperar o perfil de cor atual.

Definir/GetToneCurve

GetToneCurve e SetToneCurve especificam a curva de tom a ser aplicada. Suponha a interpolação linear entre pontos. O pToneCurve é uma estrutura WICRawToneCurve, que contém uma matriz de estruturas de WICRawToneCurvePoint e uma contagem do número de pontos na matriz.

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

Um WICRawToneCurvePoint contém um valor de entrada e um valor de saída.

struct WICRawToneCurvePoint 
{
   double Input;
   double Output;
}

Quando o chamador passa NULL no parâmetro pToneCurve, você deve passar de volta o tamanho necessário para oWICRawToneCurveno parâmetro pcbActualToneCurveBufferSize.

Definir/ObterRotação

GetRotation e SetRotation indicam o grau de rotação a ser aplicado. Uma rotação de 90,0 especificaria uma rotação de 90 graus no sentido horário. (A diferença entre usar SetRotation e definir a rotação usando o método CopyPixels é que o ângulo de rotação definido usando SetRotation deve ser mantido pelo codec, enquanto a configuração de rotação através de CopyPixels apenas gira a imagem na memória.

Definir/ObterModoDeRenderização

GetRenderMode e SetRenderMode indicam o nível de qualidade de saída que o chamador requer. Quando um usuário está ajustando parâmetros, o aplicativo deve exibir uma aproximação muito rápida de como será a imagem real se as alterações forem aplicadas. Para este efeito, a imagem é geralmente exibida em resolução de tela ou menos, em vez da resolução de imagem real, para fornecer feedback imediato ao usuário. É quando um aplicativo solicita a qualidade do Modo de Rascunho, então isso deve ser muito rápido. Quando o usuário fez todas as alterações, visualizou-as no modo rascunho e decidiu decodificar a imagem completa com as configurações atuais, o aplicativo solicita uma decodificação de melhor qualidade. Isso geralmente também é solicitado para impressão. Quando é necessária uma compensação razoável entre velocidade e qualidade, a aplicação solicita Qualidade Normal.

enum WICRawRenderMode
{
   WICRawRenderModeDraftMode,
   WICRawRenderModeNormalQuality ,
   WICRawRenderModeBestQuality
}

SetNotificationCallback

SetNotificationCallback regista uma função callback para o decodificador chamar quando qualquer um dos parâmetros de processamento Raw for alterado. A assinatura para o IWICDevelopRawNotificationCallback tem apenas um método, chamado Notify. Notificar tem um único parâmetro, que é uma máscara que indica quais dos parâmetros de processamento bruto foram alterados.

HRESULT Notify ( UINT NotificationMask );

Uma operação OR é executada nos seguintes valores para o 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

Referência

IWICDevelopRaw

Conceptual

Implementando o IWICBitmapSourceTransform

Implementando um codificador WIC-Enabled

Como escrever um WIC-Enabled CODEC

Visão geral do componente Windows Imaging