Implementación de IWICBitmapSourceTransform

IWICBitmapSourceTransform

Aunque es opcional, se recomienda encarecidamente que cada descodificador implemente esta interfaz en la clase de descodificación de nivel de fotograma, ya que puede proporcionar importantes ventajas de rendimiento. Cuando una aplicación solicita una región específica de interés, tamaño, orientación o formato de píxel, en lugar de simplemente descodificar toda la imagen en resolución completa y, a continuación, aplicar las transformaciones solicitadas, Windows Imaging Component (WIC) llama a IUnknown::QueryInterface para esta interfaz en el objeto IWICBitmapFrameDecode . Si el descodificador de fotogramas lo admite, WIC llama al método o a los métodos adecuados para determinar si el descodificador de fotogramas puede realizar la transformación solicitada o determinar el tamaño más cercano o el formato de píxel que el descodificador puede proporcionar al solicitado. Si el descodificador puede realizar la transformación o las transformaciones solicitadas, WIC invoca CopyPixels con los parámetros adecuados. Si el descodificador puede realizar algunas transformaciones, pero no todas las transformaciones solicitadas, WIC pide al descodificador que realice los objetos de transformación de WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator e IWICFormatConverter) para realizar las transformaciones restantes que el descodificador de fotogramas no pudo realizar en el resultado de la llamada a CopyPixels . Si el descodificador no admite IWICBitmapSourceTransform, WIC debe usar los objetos de transformación para realizar todas las transformaciones. Normalmente es mucho más eficaz para que el descodificador realice transformaciones durante el proceso de descodificación de la que es descodificar toda la imagen y, a continuación, realizar las transformaciones. Esto es especialmente cierto para operaciones como el escalado a conversiones de formato de píxel o tamaño mucho más pequeños.

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 pregunta si el descodificador admite la operación de rotación o volteo solicitadas. WiCBitmapTransformOptions que se puede solicitar son:

enum WICBitmapTransformOptions
{   
   WICBitmapTransformRotate0,
   WICBitmapTransformRotate90,
   WICBitmapTransformRotate180,
   WICBitmapTransformRotate270,
   WICBitmapTransformFlipHorizontal,
   WICBitmapTransformFlipVertical
}

CopyPixels

CopyPixels realiza el trabajo real de descodificar los bits de imagen, como el método CopyPixels en la interfaz IWICBitmapSource , pero el método CopyPixels en IWICBitmapSourceTransform es mucho más eficaz y puede mejorar significativamente el rendimiento del procesamiento de imágenes.

Cuando se solicitan varias operaciones de transformación, el resultado depende del orden en que se realizan las operaciones. Para garantizar la predictibilidad y la coherencia entre códecs, es importante que todos los códecs realicen estas operaciones en el mismo orden. Este es el orden canónico para realizar estas operaciones.

  1. Escala
  2. Recortar
  3. Girar

La conversión de formato de píxeles se puede realizar en cualquier momento, ya que no tiene ningún efecto en las demás transformaciones.

El primer parámetro, prcSrc, se usa para especificar la región de interés para recortar la imagen. Dado que el escalado se realiza antes de recortar por convención, si la imagen se va a escalar y recortar, la región de interés debe determinarse después de que se haya escalado la imagen.

Los parámetros segundo y tercero indican el tamaño al que se va a escalar la imagen.

El parámetro pguidDstFormat indica el formato de píxel solicitado para la imagen descodificada. Dado que WIC ya ha llamado a GetClosestPixelFormat, debe ser un formato de píxel que el descodificador ha indicado que admite.

El parámetro dstTransform indica el ángulo de rotación solicitado y si se va a voltear la imagen vertical, horizontalmente o ambas. De nuevo, dado que WIC ya ha llamado a DoesSupportTransform, la transformación solicitada debe ser la que el descodificador ya ha indicado que admite. Recuerde que la rotación siempre debe realizarse después del escalado y el recorte.

GetClosestSize

GetClosestSize toma dos parámetros de in/out. El autor de la llamada usa los parámetros puiWidth y puiHeight para especificar el tamaño en el que el autor de la llamada prefiere descodificar la imagen. Sin embargo, un descodificador solo puede descodificar una imagen a un tamaño que sea múltiplo de su tamaño DCT y diferentes formatos de imagen pueden tener diferentes tamaños de DCT. El descodificador debe determinar, en función de su propio tamaño DCT, el más cercano que pueda llegar al tamaño solicitado y establecer el puiWidth y puiHeight en esas dimensiones a cambio. Si se solicita un tamaño mayor, pero el códec no admite el escalado vertical, se debe devolver el original.

GetClosestPixelFormat

GetClosestPixelFormat se usa para determinar el formato de píxel más cercano al formato de píxel solicitado que el descodificador puede proporcionar sin pérdida de datos. Siempre es preferible convertir a un formato de píxel más ancho que uno más estrecho, aunque aumentará el tamaño de la imagen, ya que siempre se puede reconvertir a un formato más restrictivo si es necesario. Sin embargo, después de que se pierdan los datos, no se puede recuperar.

Lectura continua

Para obtener más información sobre cómo crear un códec habilitado para WIC, consulte Implementación de IWICDevelopRaw.

Referencia

IWICBitmapSourceTransform

IWICMetadataBlockReader

Conceptual

Implementación de IWICMetadataBlockReader

Implementación de IWICDevelopRaw

Cómo escribir un CÓDEC de WIC-Enabled

Información general sobre el componente de creación de imágenes de Windows