Implementando 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 toda a imagem em resolução total e, em seguida, aplicar as transformações solicitadas, o Componente de Imagem do Windows (WIC) chama IUnknown::QueryInterface para essa interface no objeto IWICBitmapFrameDecode . Se o decodificador de quadro der suporte a ele, o WIC chamará o método ou os métodos apropriados para determinar se o decodificador de quadro pode executar a transformação solicitada ou determinar o tamanho ou o formato de pixel mais próximo que o decodificador pode fornecer ao solicitado. Se o decodificador puder executar a transformação ou as transformações solicitadas, o WIC invocará CopyPixels com os parâmetros apropriados. Se o decodificador puder executar alguns, mas nem todas as transformações solicitadas, o WIC solicita que o decodificador execute aqueles que puder e usa os objetos de transformação wic (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator e IWICFormatConverter) para executar as transformações restantes que não puderam ser executadas pelo decodificador de quadro no resultado da chamada CopyPixels . Se o decodificador não der suporte a IWICBitmapSourceTransform, o WIC deverá usar os objetos de transformação 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 toda a imagem 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
DoesSupportTransform pergunta se o decodificador dá suporte à operação de rotação ou inversão solicitada. As WICBitmapTransformOptions que podem ser solicitadas 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étodo CopyPixels na interface IWICBitmapSource , mas o método CopyPixels em IWICBitmapSourceTransform é muito mais poderoso e pode melhorar significativamente o desempenho do processamento de imagens.
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 a previsibilidade e a consistência entre codecs, é importante que todos os codecs executem essas operações na mesma ordem. Essa é a ordem canônica para executar essas operações.
- Escala
- Crop
- Rotate
A conversão de formato de pixel pode ser executada a qualquer momento, pois 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 é executado antes do recorte por convenção, se a imagem deve ser dimensionada, bem como recortada, a região de interesse deve ser determinada após a escala da imagem.
O segundo e o terceiro parâmetros indicam o tamanho para o qual dimensionar a imagem.
O parâmetro pguidDstFormat indica o formato de pixel solicitado para a imagem decodificada. Como o WIC já chamou GetClosestPixelFormat, esse deve ser um formato de pixel que o decodificador indicou que dá suporte.
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 dá suporte. Lembre-se de que a rotação sempre deve ser executada 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 que é um múltiplo de seu tamanho DCT, e diferentes formatos de imagem podem ter tamanhos dct diferentes. O decodificador deve determinar, com base em seu próprio tamanho dct, o mais próximo que ele pode chegar ao tamanho solicitado e definir puiWidth e puiHeight para essas dimensões no retorno. Se um tamanho maior for solicitado, mas o codec não der suporte ao upscaling, o original deverá ser retornado.
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 em um formato de pixel mais amplo do que um mais estreito, mesmo que ele aumente o tamanho da imagem, pois ela sempre pode ser reconvertida para um formato mais restritivo, se necessário. No entanto, depois que os dados são perdidos, eles não podem ser recuperados.
Leitura contínua
Para saber mais sobre como criar um codec habilitado para WIC, consulte Implementando IWICDevelopRaw.
Tópicos relacionados
-
Referência
-
Conceitual