Partager via


Implémentation d’IWICBitmapSourceTransform

IWICBitmapSourceTransform

Bien qu’elle soit facultative, nous recommandons vivement que chaque décodeur implémente cette interface sur votre classe de décodage au niveau de l’image, car elle peut offrir des avantages majeurs en matière de performances. Lorsqu’une application demande une région d’intérêt, une taille, une orientation ou un format de pixel spécifique, au lieu de décoder l’image entière à pleine résolution, puis d’appliquer les transformations demandées, Windows Imaging Component (WIC) appelle IUnknown::QueryInterface pour cette interface sur l’objet IWICBitmapFrameDecode . Si le décodeur de trame le prend en charge, WIC appelle la ou les méthodes appropriées pour déterminer si le décodeur de trame peut effectuer la transformation demandée ou déterminer la taille ou le format de pixel le plus proche que le décodeur peut fournir à celui demandé. Si le décodeur peut effectuer la ou les transformations demandées, WIC appelle CopyPixels avec les paramètres appropriés. Si le décodeur peut effectuer certaines transformations demandées, mais pas toutes les transformations demandées, WIC demande au décodeur d’effectuer celles qu’il peut et utilise les objets de transformation WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator et IWICFormatConverter) pour effectuer les transformations restantes qui n’ont pas pu être effectuées par le décodeur de trame sur le résultat de l’appel CopyPixels . Si le décodeur ne prend pas en charge IWICBitmapSourceTransform, WIC doit utiliser les objets de transformation pour effectuer toutes les transformations. Il est généralement beaucoup plus efficace pour le décodeur d’effectuer des transformations pendant le processus de décodage que de décoder l’image entière, puis d’effectuer les transformations. Cela est particulièrement vrai pour les opérations telles que la mise à l’échelle vers une taille beaucoup plus petite ou les conversions de format de pixels.

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 demande si le décodeur prend en charge l’opération de rotation ou de basculement demandée. Les options WICBitmapTransformOption qui peuvent être demandées sont les suivantes :

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

CopyPixels

CopyPixels effectue le travail réel de décodage des bits d’image, comme la méthode CopyPixels sur l’interface IWICBitmapSource , mais la méthode CopyPixels sur IWICBitmapSourceTransform est beaucoup plus puissante et peut améliorer considérablement les performances de traitement des images.

Lorsque plusieurs opérations de transformation sont demandées, le résultat dépend de l’ordre dans lequel les opérations sont effectuées. Pour garantir la prévisibilité et la cohérence entre les codecs, il est important que tous les codecs effectuent ces opérations dans le même ordre. Il s’agit de l’ordre canonique pour l’exécution de ces opérations.

  1. Scale
  2. Rogner
  3. Faire pivoter

La conversion de format de pixel peut être effectuée à tout moment, car elle n’a aucun effet sur les autres transformations.

Le premier paramètre, prcSrc, est utilisé pour spécifier la région d’intérêt pour le découpage de l’image. Étant donné que la mise à l’échelle est effectuée avant le découpage par convention, si l’image doit être mise à l’échelle et découpée, la zone d’intérêt doit être déterminée après la mise à l’échelle de l’image.

Les deuxième et troisième paramètres indiquent la taille à laquelle mettre à l’échelle l’image.

Le paramètre pguidDstFormat indique le format de pixel demandé pour l’image décodée. Étant donné que WIC a déjà appelé GetClosestPixelFormat, il doit s’agir d’un format de pixel que le décodeur a indiqué qu’il prend en charge.

Le paramètre dstTransform indique l’angle de rotation demandé et indique s’il faut retourner l’image verticalement, horizontalement ou les deux. Là encore, étant donné que WIC aura déjà appelé DoesSupportTransform, la transformation demandée doit être celle que le décodeur a déjà indiquée qu’elle prend en charge. N’oubliez pas que la rotation doit toujours être effectuée après la mise à l’échelle et le découpage.

GetClosestSize

GetClosestSize prend deux paramètres d’entrée/sortie. L’appelant utilise les paramètres puiWidth et puiHeight pour spécifier la taille à laquelle l’appelant préfère décoder l’image. Toutefois, un décodeur peut décoder une image uniquement à une taille qui est un multiple de sa taille DCT, et différents formats d’image peuvent avoir des tailles DCT différentes. Le décodeur doit déterminer, en fonction de sa propre taille DCT, la plus proche possible de la taille demandée, et définir puiWidth et puiHeight sur ces dimensions au retour. Si une plus grande taille est demandée, mais que le codec ne prend pas en charge la mise à l’échelle, l’original doit être retourné.

GetClosestPixelFormat

GetClosestPixelFormat permet de déterminer le format de pixel le plus proche du format de pixel demandé que le décodeur peut fournir sans perte de données. Il est toujours préférable de convertir vers un format de pixel plus large qu’un format plus étroit, même si cela augmente la taille de l’image, car elle peut toujours être reconvertie vers un format plus restrictif si nécessaire. Toutefois, une fois les données perdues, elles ne peuvent pas être récupérées.

Lecture continue

Pour en savoir plus sur la création d’un codec compatible WIC, consultez Implémentation d’IWICDevelopRaw.

Informations de référence

IWICBitmapSourceTransform

Iwicmetadatablockreader

Conceptuel

Implémentation d’IWICMetadataBlockReader

Implémentation d’IWICDevelopRaw

Comment écrire un codec WIC-Enabled

Vue d’ensemble du composant d’acquisition d’images Windows