Принцип работы компонента обработки образов Windows

Обнаружение и арбитраж

Перед декодированием изображения необходимо найти соответствующий кодек, который может декодировать этот формат изображения. В большинстве систем, так как поддерживаемые форматы изображений жестко заданы, процесс обнаружения не требуется. Так как платформа компонента обработки изображений Windows (WIC) является расширяемой, необходимо иметь возможность определить формат изображения и сопоставить его с соответствующим кодеком.

Для поддержки обнаружения во время выполнения каждый формат изображения должен иметь идентифицирующие шаблоны, которые можно использовать для определения подходящего декодера для этого формата. (Для новых форматов файлов настоятельно рекомендуется использовать GUID для идентифицируемого шаблона, так как он гарантированно будет уникальным.) Идентифицирующие шаблоны должны быть внедрены в каждый файл изображения, соответствующий соответствующему формату изображения. У каждого декодера есть запись реестра, указывающая шаблон или шаблоны форматов изображений, которые он может декодировать. Когда приложению необходимо открыть изображение, оно запрашивает декодер из WIC. WIC ищет доступные декодеры в реестре и проверяет каждую запись реестра на наличие шаблона, соответствующего шаблону, внедренного в файл образа. Дополнительные сведения о записях реестра декодера см. в разделе Записи реестра, относящиеся к кодировщику.

Когда WIC находит один декодер, соответствующий идентифицируемой схеме на изображении, он создает экземпляр декодера и передает ему файл изображения. Если WIC находит несколько совпадений, он вызывает метод QueryCapability для каждого соответствующего декодера, чтобы выполнить арбитраж среди них и найти лучшее совпадение. Дополнительные сведения см. в разделе QueryCapabilities в разделе Реализация IWICBitmapDecoder.

Декодирование

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

  • Службы на уровне контейнеров
  • Службы на уровне кадров
  • Службы перечисления метаданных
  • Собственные преобразования декодера
  • Уведомления о ходе выполнения и поддержка отмены
  • Необработанные службы обработки

Службы уровня контейнера включают получение эскиза верхнего уровня (если поддерживается), предварительный просмотр, контексты цвета, палитру (если применимо) и формат контейнера, а также предоставление доступа к отдельным кадрам изображений в контейнере. (Некоторые контейнеры содержат только один кадр, а другие, например TIFF, могут содержать несколько кадров.) Этот набор служб также включает в себя предоставление сведений о самом декодере и его возможностях в отношении конкретного файла изображения.

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

WIC предоставляет средства чтения метаданных для наиболее распространенных форматов метаданных (IFD, EXIF, IPTC, XMP, APP0, APP1 и других форматов), а также поддерживает расширяемость для сторонних форматов метаданных. Это освобождает кодек от ответственности за анализ метаданных. Однако кодек отвечает за перечисление блоков метаданных и запрос читателя метаданных для каждого блока. WIC выполняет обнаружение для обработчиков метаданных так же, как и для кодеков, на основе шаблона в заголовке блока, соответствующего шаблону в записи реестра обработчика метаданных. Дополнительные сведения см. в разделе Записи реестра, относящиеся к кодировщику.

Декодеры не требуются для встроенной поддержки операций преобразования, но это обеспечивает значительную оптимизацию производительности, которая обеспечивает более эффективное взаимодействие с конечными пользователями. Например, приложение может создать конвейер различных преобразований (масштабирование, обрезка, поворот и преобразование формата пикселей) для выполнения на изображении перед отрисовкой изображения. Дополнительные сведения о конвейерах преобразования см. в разделе IWICBitmapSource. После создания конвейера преобразования приложение запрашивает окончательное преобразование в конвейере для создания растрового изображения, полученного в результате применения всех преобразований к источнику изображения. На этом этапе, если декодер сам может выполнять операции преобразования, WIC спрашивает, какое из запрошенных преобразований он может выполнить. Любые запрошенные преобразования, которые не может выполнить декодер, будут выполнены WIC для декодированного изображения, прежде чем вернуть его вызывающему объекту. Этот оптимизированный конвейер преобразования обеспечивает более высокую производительность по сравнению с последовательным выполнением каждого преобразования в памяти, особенно если некоторые или все преобразования могут быть выполнены в процессе декодирования.

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

Эти интерфейсы подробно описаны в разделе Реализация декодера с поддержкой WIC.

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

Кодирование

Как и декодеры, кодировщики имеют обязанности, которые они реализуют через интерфейсы. Службы, предоставляемые кодировщиками, дополняют службы, предоставляемые декодировщиками, за исключением того, что они записывают данные изображений, а не считывают их. Кодировщики также предоставляют службы в следующих категориях:

  • Службы на уровне контейнеров
  • Службы на уровне кадров
  • Службы перечисления метаданных и обновления
  • Поддержка уведомлений о ходе выполнения и отмены

Службы уровня контейнера для кодировщика включают настройку эскиза верхнего уровня (если поддерживается), предварительного просмотра и палитры (если применимо) и итерацию по отдельным кадрам изображений, чтобы их можно было сериализовать в контейнер.

Службы уровня кадра для кодировщика зеркало для декодера, за исключением того, что они записывают данные изображения, эскизы и любую связанную палитру или другой компонент, а не считывают их.

Кроме того, службы перечисления метаданных для кодировщика включают перебор записываемых блоков метаданных и вызов соответствующих модулей записи метаданных для сериализации метаданных на диск.

Эти интерфейсы подробно описаны в разделе Реализация кодировщика с поддержкой WIC.

Время существования кодека

Кодек WIC создается для обработки одного образа и обычно имеет короткий срок существования. Он создается при загрузке образа и освобождается при закрытии образа. Приложение может использовать большое количество кодеков одновременно с перекрывающимися временем существования (например, прокрутка каталога, содержащего сотни изображений), и несколько приложений могут делать это одновременно.

Хотя некоторые кодеки имеют время существования, которое ограничивается временем существования процесса, в котором они живут, это не относится к кодекам WIC. Фотоальбом Windows Vista, Windows Обозреватель и Средство просмотра фотографий, а также множество других приложений основаны на WIC и будут использовать кодек для отображения изображений и эскизов. Если время существования кодека ограничивается временем существования процесса, при каждом отображении изображения или эскиза в Обозреватель Windows Vista экземпляр кодека для декодирования этого изображения будет оставаться в памяти до следующего перезапуска компьютера пользователем. Если кодек никогда не выгружается, его ресурсы фактически "утечка", так как они не могут использоваться каким-либо другим компонентом в системе.

Включение кодека WIC

  1. Реализуйте класс декодера уровня контейнера и класс декодера уровня кадра, который предоставляет необходимые интерфейсы WIC для декодирования изображений и перебирания блоков метаданных. Это позволяет всем приложениям на основе WIC взаимодействовать с кодеком так же, как и со стандартными форматами изображений.
  2. Реализуйте класс кодировщика уровня контейнера и класс кодировщика уровня кадра, который предоставляет необходимые интерфейсы WIC для кодирования изображений и сериализации блоков метаданных в файл изображения.
  3. Если формат контейнера не основан на контейнере TIFF или JPEG, может потребоваться написать обработчики метаданных для распространенных форматов метаданных (EXIF, XMP). Однако если вы используете формат контейнера на основе TIFF или JPEG, это необязательно, так как вы можете делегировать обработчикам метаданных, предоставляемым системой.
  4. Внедрите уникальный идентифицирующие шаблон (рекомендуется guid) во все файлы изображений. Это позволяет сопоставлять формат изображения с вашим кодеком во время обнаружения. Если вы пишете оболочку WIC для существующего формата изображения, необходимо найти шаблон битов, который кодировщик всегда записывает в свои файлы изображений, которые являются уникальными для этого формата изображения, и использовать его в качестве идентифицируемого шаблона.)
  5. Зарегистрируйте кодек во время установки. Это позволяет обнаруживать кодек во время выполнения, сопоставляя идентифицирующие шаблоны в реестре с шаблоном, внедренным в файл образа.
  6. В Windows 7 для WIC требуется, чтобы кодеки были типа com-квартиры "Оба". Это означает, что необходимо выполнить соответствующую блокировку для обработки вызовов между подразделениями и вызывающих абонентов в многопоточных сценариях. Дополнительные сведения см. в следующем разделе о поддержке многопоточных квартир.
  7. Поддержка 64-разрядных платформ. Для Windows 7 WIC потребует, чтобы сторонние кодеки WIC были доставлены как 32-разрядные, так и 64-разрядные собственные двоичные файлы. Кроме того, 32-разрядная форма должна устанавливаться и запускаться в 64-разрядных системах, а сторонний установщик кодека Windows 7 должен устанавливать как 32-разрядные, так и 64-разрядные двоичные файлы в 64-разрядных системах.

Поддержка многопоточных квартир в WIC

Объекты в многопотоковом объекте (MTA) могут вызываться одновременно любым количеством потоков в MTA. Это позволяет повысить производительность в многоядерных системах и определенных сценариях сервера. Кроме того, кодеки WIC в MTA могут вызывать другие объекты в MTA без затрат на маршалинг, связанных с вызовом между потоками в разных квартирах STA. В Windows 7 все встроенные кодеки WIC были обновлены для поддержки mtas, включая JPEG, TIFF, PNG, GIF, ICO и BMP. Настоятельно рекомендуется написать сторонние кодеки для поддержки mtas. Сторонние кодеки, которые не поддерживают mtAs, приводят к значительным затратам на производительность многопоточных приложений из-за маршалинга. Включение поддержки MTA требует надлежащей синхронизации в стороннем кодеке. Точная реализация этих методов синхронизации выходит за рамки область этого документа. Дополнительные сведения о синхронизации COM-объектов см. в разделе Основные сведения о моделях потоков COM и их использовании.

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

Введение (создание кодека с поддержкой WIC)

Реализация декодера с поддержкой WIC

Создание кодека с поддержкой WIC

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

Общие сведения о метаданных WIC