Efeito de origem do bitmap

Use o efeito de origem do bitmap para gerar uma ID2D1Image de um IWICBitmapSource para uso como uma entrada em um grafo de efeito. Esse efeito executa o dimensionamento e a rotação na CPU. Opcionalmente, ele também pode gerar um mipmap de memória do sistema, que pode ser uma otimização de desempenho para dimensionar ativamente imagens muito grandes em várias resoluções reduzidas.

Observação

O efeito de origem do bitmap usa sua entrada como uma propriedade, não como uma entrada de imagem. Você deve usar o método SetValue , não o método SetInput . A propriedade WicBitmapSource é onde você especifica os dados de entrada da imagem.

O CLSID para esse efeito é CLSID_D2D1BitmapSource.

Propriedades do efeito

Nome de exibição e enumeração de índice Descrição
WicBitmapSource
D2D1_BITMAPSOURCE_PROP_WIC_BITMAP_SOURCE
O IWICBitmapSource que contém os dados de imagem a serem carregados.
O tipo é IWICBitmapSource.
O valor padrão é NULL.
Escala
D2D1_BITMAPSOURCE_PROP_SCALE
A quantidade de escala na direção X e Y. O efeito multiplica a largura pelo valor X e a altura pelo valor Y. Essa propriedade é uma D2D1_VECTOR_2F definida como: (escala X, escala Y). As quantidades de escala são FLOAT, sem unidade e devem ser positivas ou 0.
O tipo é D2D1_VECTOR_2F.
O valor padrão é {1.0f, 1.0f}.
Interpolationmode.
D2D1_BITMAPSOURCE_PROP_INTERPOLATION_MODE
O modo de interpolação usado para dimensionar a imagem. Consulte Modos de interpolação para obter mais informações.
Se o modo desabilitar o mipmap, o BitmapSouce armazenará em cache a imagem na resolução determinada pelas propriedades Scale e EnableDPICorrection.
O tipo é D2D1_BITMAPSOURCE_INTERPOLATION_MODE.
O valor padrão é D2D1_BITMAPSOURCE_INTERPOLATION_MODE_LINEAR.
EnableDPICorrection
D2D1_BITMAPSOURCE_PROP_ENABLE_DPI_CORRECTION
Se você definir isso como TRUE, o efeito dimensionará a imagem de entrada para converter o DPI relatado por IWICBitmapSource no DPI do contexto do dispositivo. O efeito usa o modo de interpolação definido com a propriedade InterpolationMode. Se você definir isso como FALSE, o efeito usará um DPI de 96.0 para a imagem de saída.
O tipo é BOOL.
O valor padrão é FALSE.
AlphaMode
D2D1_BITMAPSOURCE_PROP_ALPHA_MODE
O modo alfa da saída. Isso pode ser pré-multiplicado ou reto. Confira Modos alfa para obter mais informações.
O tipo é D2D1_BITMAPSOURCE_ALPHA_MODE.
O valor padrão é D2D1_BITMAPSOURCE_ALPHA_MODE_PREMULTIPLIED.
Orientation
D2D1_BITMAPSOURCE_PROP_ORIENTATION
Uma operação de inversão e/ou rotação a ser executada na imagem. Consulte Orientação para obter mais informações.
O tipo é D2D1_BITMAPSOURCE_ORIENTATION.
O valor padrão é D2D1_BITMAPSOURCE_ORIENTATION_DEFAULT.

Modos de interpolação

O efeito interpola usando esse modo quando dimensiona uma imagem ou quando corrige o DPI. Os modos de interpolação que esse efeito usa são calculados pela CPU, não pela GPU.

Nome Descrição
D2D1_BITMAPSOURCE_INTERPOLATION_MODE_NEAREST_NEIGHBOR Amostra o ponto único mais próximo e usa isso. Não gera um mipmap.
D2D1_BITMAPSOURCE_INTERPOLATION_MODE_LINEAR Usa um exemplo de quatro pontos e interpolação linear. Não gera um mipmap.
D2D1_BITMAPSOURCE_INTERPOLATION_MODE_CUBIC Usa um kernel cúbico de 16 amostras para interpolação. Não gera um mipmap.
D2D1_BITMAPSOURCE_INTERPOLATION_MODE_FANT Usa a interpolação de fant wic, o mesmo que a interface IWICBitmapScaler . Não gera um mipmap.
D2D1_BITMAPSOURCE_INTERPOLATION_MODE_MIPMAP_LINEAR Gera a cadeia de mipmap na memória do sistema usando a interpolação bilinear. Para cada mipmap, o efeito é dimensionado para o múltiplo mais próximo de 0,5 usando interpolação bilinear e, em seguida, dimensiona a quantidade restante usando interpolação linear.

Orientation

A propriedade Orientation pode ser usada para aplicar um sinalizador de orientação EXIF inserido em uma imagem.

Nome Descrição
D2D1_BITMAPSOURCE_ORIENTATION_DEFAULT Padrão. O efeito não altera a orientação da entrada.
D2D1_BITMAPSOURCE_ORIENTATION_FLIP_HORIZONTAL Inverte a imagem horizontalmente.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE180 Gira a imagem no sentido horário 180 graus.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE180_FLIP_HORIZONTAL Gira a imagem no sentido horário 180 graus e a inverte horizontalmente.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE270_FLIP_HORIZONTAL Gira a imagem no sentido horário 270 graus e a inverte horizontalmente.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE90 Gira a imagem no sentido horário 90 graus.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE90_FLIP_HORIZONTAL Gira a imagem no sentido horário 90 graus e a inverte horizontalmente.
D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE270 Gira a imagem no sentido horário 270 graus.

Este snippet de código demonstra como converter de valores de orientação EXIF (definidos em propkey.h) em valores D2D1_BITMAPSOURCE_ORIENTATION.

#include <propkey.h>
#include <d2d1effects.h>

D2D1_BITMAPSOURCE_ORIENTATION GetBitmapSourceOrientation(unsigned short PhotoOrientation)
{
       switch (PhotoOrientation)
       {
       case PHOTO_ORIENTATION_NORMAL:
              return D2D1_BITMAPSOURCE_ORIENTATION_DEFAULT;
       case PHOTO_ORIENTATION_FLIPHORIZONTAL:
              return D2D1_BITMAPSOURCE_ORIENTATION_FLIP_HORIZONTAL;
       case PHOTO_ORIENTATION_ROTATE180:
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE180;
       case PHOTO_ORIENTATION_FLIPVERTICAL:
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE180_FLIP_HORIZONTAL;
       case PHOTO_ORIENTATION_TRANSPOSE: 
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE90_FLIP_HORIZONTAL;
       case PHOTO_ORIENTATION_ROTATE270:
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE90;
       case PHOTO_ORIENTATION_TRANSVERSE:
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE270_FLIP_HORIZONTAL;
       case PHOTO_ORIENTATION_ROTATE90:
              return D2D1_BITMAPSOURCE_ORIENTATION_ROTATE_CLOCKWISE270;
       default:
              return D2D1_BITMAPSOURCE_ORIENTATION_DEFAULT;
       }
}

Modos alfa

Nome Descrição
D2D1_BITMAPSOURCE_ALPHA_MODE_PREMULTIPLIED A saída do efeito usa alfa pré-multiplicado.
D2D1_BITMAPSOURCE_ALPHA_MODE_STRAIGHT A saída do efeito usa alfa reto.

Comentários

Para otimizar o desempenho ao usar o WIC e Direct2D juntos, você deve usar IWICFormatConverter para converter em um formato de pixel apropriado com base no cenário do aplicativo e na precisão nativa da imagem.

Na maioria dos casos, o pipeline de Direct2D do aplicativo requer apenas 8 bits por canal (bpc) de precisão ou a imagem fornece apenas 8 bpc de precisão e, portanto, você deve converter em GUID_WICPixelFormat32bppPBGRA. No entanto, se você quiser aproveitar a precisão extra fornecida por uma imagem (por exemplo, um JPEG-XR ou TIFF armazenado com maior que 8 bpc de precisão), deverá usar um formato de pixel baseado em RGBA. A tabela abaixo fornece mais detalhes.

Precisão desejada Precisão nativa da imagem Formato de pixel recomendado
8 bits por canal <= 8 bits por canal GUID_WICPixelFormat32bppPBGRA
O mais alto possível <= 8 bits por canal GUID_WICPixelFormat32bppPBGRA
O mais alto possível > 8 bits por canal Ordem de canal RGBA, alfa pré-multiplicado

Como muitos formatos de imagem dão suporte a vários níveis de precisão, você deve usar IWICBitmapSource::GetPixelFormat para obter o formato de pixel nativo da imagem e, em seguida, usar IWICPixelFormatInfo para determinar quantos bits por canal de precisão estão disponíveis para esse formato. Além disso, observe que nem todo hardware dá suporte a formatos de pixel de alta precisão. Nesses casos, talvez seu aplicativo precise fazer fallback para o dispositivo WARP para dar suporte à alta precisão.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8 e Atualização de Plataforma para Windows 7 [aplicativos da área de trabalho | Aplicativos da Windows Store]
Servidor mínimo com suporte Windows 8 e Atualização de Plataforma para Windows 7 [aplicativos da área de trabalho | Aplicativos da Windows Store]
Cabeçalho d2d1effects.h
Biblioteca d2d1.lib, dxguid.lib

ID2D1Effect