Внедрение 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 спрашивает, поддерживает ли декодатор запрошенную операцию поворота или перевернутого поворота. WICBitmapTransformOptions, которые могут быть запрошены:
enum WICBitmapTransformOptions
{
WICBitmapTransformRotate0,
WICBitmapTransformRotate90,
WICBitmapTransformRotate180,
WICBitmapTransformRotate270,
WICBitmapTransformFlipHorizontal,
WICBitmapTransformFlipVertical
}
CopyPixels
CopyPixels выполняет фактическую работу по декодированию битов изображения, например метод CopyPixels в интерфейсе IWICBitmapSource, но метод CopyPixels на IWICBitmapSourceTransform значительно эффективнее и может значительно повысить производительность обработки изображений.
При запросе нескольких операций преобразования результат зависит от порядка выполнения операций. Чтобы обеспечить предсказуемость и согласованность в кодеках, важно, чтобы все кодеки выполняли эти операции в одном порядке. Это канонический порядок выполнения этих операций.
- Шкала
- Урожай
- Вращать
Преобразование формата пикселей можно выполнять в любое время, так как оно не влияет на другие преобразования.
Первый параметр, prcSrc, используется для указания интересующего региона для обрезки изображения. Поскольку по соглашению масштабирование осуществляется до обрезки, если изображение должно быть как масштабировано, так и обрезано, область интереса следует определять после масштабирования.
Второй и третий параметры указывают размер, на который следует масштабировать изображение.
Параметр pguidDstFormat указывает запрошенный формат пикселя для декодированного изображения. Поскольку WIC уже вызвал GetClosestPixelFormat, это должен быть формат пикселей, который декодировщик указал как поддерживаемый.
Параметр dstTransform указывает запрошенный угол поворота, а также то, следует ли перевернуть изображение вертикально, горизонтально или оба. Опять же, так как WIC уже вызвал DoesSupportTransform, запрошенное преобразование должно быть тем, который декодер уже указал как поддерживаемый. Помните, что поворот всегда должен выполняться после масштабирования и обрезки.
НайтиБлижайшийРазмер
GetClosestSize принимает два параметра in/out. Вызывающий объект использует параметры puiWidth и puiHeight, чтобы указать размер, по которому вызывающий объект предпочитает декодировать изображение. Однако декодатор может декодировать изображение только до размера, который является кратным его размера DCT, и разные форматы изображений могут иметь разные размеры DCT. Декодатор должен определить, исходя из собственного размера DCT, насколько близко он может подойти к запрошенным размерам, и установить puiWidth и puiHeight в эти размеры по завершении. Если запрашивается больший размер, но кодек не поддерживает масштабирование, исходный объект должен быть возвращен.
GetClosestPixelFormat
GetClosestPixelFormat используется для определения ближайшего формата пикселей к запрошенным формату пикселей, который декодировщик может предоставлять без потери данных. Всегда предпочтительнее преобразовывать изображение в более широкий формат пикселей, чем в более узкий, поскольку, хотя это и увеличит размер изображения, его всегда можно преобразовать обратно в более строгий формат, если это необходимо. Однако после потери данных его невозможно восстановить.
Продолжение чтения
Дополнительные сведения о создании кодека с поддержкой WIC см. в статье Реализация IWICDevelopRaw.
Связанные разделы
-
Справочник
-
Концептуальный