Implementação de IWICBitmapSourceTransform
IWICBitmapSourceTransform
Embora opcional, é altamente recomendável que cada decodificador implemente essa interface em sua classe de decodificação no nível do quadro, pois ela pode fornecer grandes benefícios de desempenho. Quando um aplicativo solicita uma região específica de interesse, tamanho, orientação ou formato de pixel, em vez de apenas decodificar a imagem inteira em resolução total e, em seguida, aplicar as transformações solicitadas, o Windows Imaging Component (WIC) chama IUnknown::QueryInterface para essa interface no objetoIWICBitmapFrameDecode. Se o decodificador de quadros oferecer suporte a ele, o WIC chamará o método ou métodos apropriados para determinar se o decodificador de quadros pode executar a transformação solicitada ou determinar o tamanho ou formato de pixel mais próximo que o decodificador pode fornecer ao solicitado. Se o decodificador puder executar a transformação ou transformações solicitadas, o WIC invocará CopyPixels com os parâmetros apropriados. Se o decodificador puder executar algumas, mas não todas as transformações solicitadas, o WIC pedirá ao decodificador para executar as que puder, e usará os objetos de transformação WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotatore IWICFormatConverter) para executar as transformações restantes que não puderam ser executadas pelo decodificador de quadros no resultado da chamada CopyPixels. Se o decodificador não suportar IWICBitmapSourceTransform , o WIC deverá usar os objetos transform para executar todas as transformações. Geralmente, é muito mais eficiente para o decodificador executar transformações durante o processo de decodificação do que decodificar a imagem inteira e, em seguida, executar as transformações. Isso é especialmente verdadeiro para operações como dimensionamento para um tamanho muito menor ou conversões de formato de pixel.
interface IWICBitmapSourceTransform : IUnknown
{
// Required methods
HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
BOOL *pfIsSupported);
HRESULT CopyPixels ( WICRect *prcSrc,
UINT uiWidth,
UINT uiHeight,
WICPixelFormatGUID * pguidDstFormat,
WICBitmapTransformOptions dstTransform,
UINT nStride,
UINT cbBufferSize,
BYTE *pbBuffer );
// Optional methods
HRESULT GetClosestSize ( UINT *puiWidth,
UINT *puiHeight);
HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}
- DoesSupportTransform
- CopyPixels
- ObterTamanhoMaisPróximo
- GetClosestPixelFormat
DoesSupportTransform
DoesSupportTransform pergunta se o decodificador suporta a operação de rotação ou inversão solicitada. Os WICBitmapTransformOptions que podem ser solicitados são:
enum WICBitmapTransformOptions
{
WICBitmapTransformRotate0,
WICBitmapTransformRotate90,
WICBitmapTransformRotate180,
WICBitmapTransformRotate270,
WICBitmapTransformFlipHorizontal,
WICBitmapTransformFlipVertical
}
CopyPixels
CopyPixels executa o trabalho real de decodificação dos bits de imagem, como o métodoCopyPixels na interfaceIWICBitmapSource, mas o método CopyPixels em IWICBitmapSourceTransform é muito mais poderoso e pode melhorar significativamente o desempenho do processamento de imagem.
Quando várias operações de transformação são solicitadas, o resultado depende da ordem em que as operações são executadas. Para garantir previsibilidade e consistência entre codecs, é importante que todos os codecs executem essas operações na mesma ordem. Esta é a ordem canônica para realizar essas operações.
- Escala
- Colheita
- Girar
A conversão de formato de pixel pode ser realizada a qualquer momento, porque não tem efeito sobre as outras transformações.
O primeiro parâmetro, prcSrc, é usado para especificar a região de interesse para recortar a imagem. Como o dimensionamento é realizado antes do recorte por convenção, se a imagem deve ser dimensionada e recortada, a região de interesse deve ser determinada após a imagem ter sido dimensionada.
O segundo e terceiro parâmetros indicam o tamanho para o qual a imagem deve ser dimensionada.
O parâmetro pguidDstFormat indica o formato de pixel solicitado para a imagem decodificada. Como o WIC já chamou GetClosestPixelFormat, este deve ser um formato de pixel que o decodificador indicou que suporta.
O parâmetro dstTransform indica o ângulo de rotação solicitado e se a imagem deve ser invertida verticalmente, horizontalmente ou ambas. Novamente, como o WIC já terá chamado DoesSupportTransform, a transformação solicitada deve ser aquela que o decodificador já indicou que suporta. Lembre-se de que a rotação deve ser sempre realizada após o dimensionamento e o recorte.
GetClosestSize
GetClosestSize usa dois parâmetros de entrada/saída. O chamador usa os parâmetros puiWidth e puiHeight para especificar o tamanho no qual o chamador prefere que a imagem seja decodificada. No entanto, um decodificador pode decodificar uma imagem apenas para um tamanho múltiplo de seu tamanho DCT, e diferentes formatos de imagem podem ter tamanhos DCT diferentes. O decodificador deve determinar, com base no seu próprio tamanho DCT, o mais próximo que possível do tamanho solicitado, e definir o puiWidth e o puiHeight para essas dimensões no retorno. Se for solicitado um tamanho maior, mas o codec não suportar upscaling, o original deverá ser devolvido.
GetClosestPixelFormat
GetClosestPixelFormat é usado para determinar o formato de pixel mais próximo do formato de pixel solicitado que o decodificador pode fornecer sem perda de dados. É sempre preferível converter para um formato de pixel mais largo do que um mais estreito, mesmo que aumente o tamanho da imagem, porque sempre pode ser reconvertido para um formato mais restritivo, se necessário. No entanto, depois que os dados são perdidos, eles não podem ser recuperados.
Leitura Continuada
Para saber mais sobre como criar um codec habilitado para WIC, consulte Implementing IWICDevelopRaw.
Tópicos relacionados
-
de referência
-
Conceptual
-
Visão geral do componente Windows Imaging