Реализация IWICBitmapSourceTransform

IWICBitmapSourceTransform

Хотя это необязательно, мы настоятельно рекомендуем каждому декодеру реализовать этот интерфейс в классе декодирования на уровне кадра, так как он может обеспечить значительные преимущества производительности. Когда приложение запрашивает определенную интересующую область, размер, ориентацию или формат пикселей, вместо простого декодирования всего изображения в полном разрешении и последующего применения запрошенных преобразований компонент образов Windows (WIC) вызывает IUnknown::QueryInterface для этого интерфейса в объекте IWICBitmapFrameDecode . Если декодер кадров поддерживает его, WIC вызывает соответствующий метод или методы, чтобы определить, может ли декодер кадра выполнить запрошенное преобразование или определить ближайший размер или формат пикселей, который декодер может предоставить запрашиваемой. Если декодер может выполнить запрошенное преобразование или преобразования, WIC вызывает CopyPixels с соответствующими параметрами. Если декодер может выполнить некоторые, но не все запрошенные преобразования, WIC просит декодер выполнить те, которые он может, и использует объекты преобразования WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator и IWICFormatConverter) для выполнения оставшихся преобразований, которые не могут быть выполнены декодером кадра в результате вызова CopyPixels . Если декодер не поддерживает IWICBitmapSourceTransform, то WIC должен использовать объекты преобразования для выполнения всех преобразований. Обычно декодер гораздо эффективнее выполнять преобразования в процессе декодирования, чем декодировать все изображение, а затем выполнять преобразования. Это особенно верно для таких операций, как масштабирование до гораздо меньшего размера или преобразования формата пикселей.

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 задает, поддерживает ли декодер запрошенную операцию поворота или переворачивания. Возможные запросы WICBitmapTransformOptions :

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

CopyPixels

CopyPixels выполняет фактическую работу по декодированию битов изображения, например метод CopyPixels в интерфейсе IWICBitmapSource , но метод CopyPixels в IWICBitmapSourceTransform является гораздо более мощным и может значительно повысить производительность обработки изображений.

При запросе нескольких операций преобразования результат зависит от порядка выполнения операций. Чтобы обеспечить предсказуемость и согласованность кодеков, важно, чтобы все кодеки выполняли эти операции в одном порядке. Это канонический порядок выполнения этих операций.

  1. Масштабирование
  2. Crop
  3. Rotate

Преобразование формата пикселей можно выполнить в любое время, так как оно не влияет на другие преобразования.

Первый параметр prcSrc используется для указания интересующей области для обрезки изображения. Так как масштабирование выполняется до обрезки по соглашению, для масштабирования и обрезания образа интересующая область должна быть определена после масштабирования изображения.

Второй и третий параметры указывают размер, до которого масштабируется изображение.

Параметр pguidDstFormat указывает запрошенный формат пикселей для декодированного изображения. Так как WIC уже называется GetClosestPixelFormat, это должен быть формат пикселей, который декодер указал, что он поддерживает.

Параметр dstTransform указывает требуемый угол поворота, а также указывает, следует ли перевернуть изображение по вертикали, по горизонтали или по обе стороны. Опять же, так как WIC уже будет вызывать DoesSupportTransform, запрошенное преобразование должно быть тем, которое декодер уже указал, что оно поддерживает. Помните, что поворот всегда должен выполняться после масштабирования и обрезки.

GetClosestSize

GetClosestSize принимает два параметра in/out. Вызывающий объект использует параметры puiWidth и puiHeight , чтобы указать размер, при котором вызывающий объект предпочитает декодировать изображение. Однако декодер может декодировать изображение только до размера, кратного его размеру DCT, а разные форматы изображений могут иметь разные размеры DCT. Декодер должен определить, исходя из собственного размера DCT, ближайший к требуемому размеру, и установить для puiWidth и puiHeight эти измерения при возврате. Если запрашивается больший размер, но кодек не поддерживает масштабирование, необходимо вернуть исходный код.

GetClosestPixelFormat

Метод GetClosestPixelFormat используется для определения формата, ближайшего к требуемому формату пикселей, который может предоставить декодер без потери данных. Всегда предпочтительнее преобразовать формат в более широкий формат пикселей, чем в более узкий формат, хотя это приведет к увеличению размера изображения, так как при необходимости его всегда можно преобразовать в более строгий формат. Однако после потери данных их невозможно восстановить.

Продолжение чтения

Дополнительные сведения о создании кодека с поддержкой WIC см. в разделе Реализация IWICDevelopRaw.

Reference

IWICBitmapSourceTransform

IWICMetadataBlockReader

Основные понятия

Реализация IWICMetadataBlockReader

Реализация IWICDevelopRaw

Написание кодека WIC-Enabled

Общие сведения о компоненте обработки образов Windows