Поделиться через


Как работает компонент образов Windows

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

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

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

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

Расшифровка

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

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

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

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

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

Декодеры не требуются для поддержки операций преобразования в собственном коде, но это обеспечивает значительные оптимизации производительности, обеспечивающие более эффективное взаимодействие с конечным пользователем. Например, приложение может создать конвейер различных преобразований (масштабирование, обрезка, поворот и преобразование формата пикселей) для выполнения на изображении перед отрисовкой изображения. Дополнительные сведения о конвейерах преобразования см. в 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-разрядных системах.

Поддержка многопоточной модели "apartment" в WIC

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

концептуальные

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

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

Как написать кодек с поддержкой WIC

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

обзор метаданных WIC