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


Интерфейсы для фильтров сегментации

Начиная с Windows Vista WIA будет поддерживать фильтры сегментации. Фильтр сегментации должен реализовывать интерфейс IWiaSegmentationFilter.

Интерфейс IWiaSegmentationFilter зависит от нового (для Windows Vista) интерфейса IWiaItem2, который используется в этом разделе, является надмножеством IWiaItem. Помимо методов IWiaItem интерфейс IWiaItem2 включает метод IWiaItem2::GetExtension, который используется приложением для создания расширений WIA, включая фильтр сегментации. Интерфейсы IWiaItem и IWiaItem2 описаны в документации по Microsoft Windows SDK.

Интерфейс IWiaSegmentationFilter реализует один метод DetectRegions. Этот метод имеет три параметра: lFlags, pInputStream и pWiaItem2.

Параметр lFlags в настоящее время не используется.

Параметр pInputStream является указателем на изображение, на котором должна быть выполнена сегментация. Обычно это изображение предварительного просмотра, представляющее всю поверхность сканирования планшета. Поток создается приложением в методе IWiaTransferCallback::GetNextStream ; этот метод вызывается во время получения образа. Драйвер записывает полученные данные изображения в поток, возвращаемый методом IWiaTransferCallback::GetNextStream . Это также поток, который должен быть передан в фильтр сегментации приложением. Интерфейс IWiaTransferCallback описан в документации по Windows SDK.

Параметр pWiaItem2 является указателем на элемент WIA, для которого был получен pInputStream . Он также называется родительским элементом. Например, элемент, на который указывает pWiaItem2 , может быть элементом с планшетом.

Метод IWiaSegmentationFilter::D etectRegions используется для определения подобласти изображения, представленного pInputStream. Для каждого обнаруженного региона IWiaSegmentationFilter::D etectRegions создает новый дочерний элемент WIA в элементе, на который указывает pWiaItem2. Для каждого дочернего элемента фильтр сегментации должен задавать значения для следующих свойств WIA: WIA_IPS_XPOS, WIA_IPS_YPOS, WIA_IPS_XEXTENT и WIA_IPS_YEXTENT. Эти свойства представляют ограничивающий прямоугольник сканируемой области. Более сложный фильтр сегментации может также задать другие свойства WIA, например свойства WIA для фильтров сегментации , если драйвер поддерживает функцию deskewing.

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

схема, иллюстрирующая, как фильтр сегментации изменяет дерево элементов приложения.

Фильтр сегментации должен поддерживать все форматы изображений, поддерживаемые драйвером, который он расширяет. Фильтр сегментации, предоставленный корпорацией Майкрософт, поддерживает форматы BMP, GIF, JPEG, PNG и TIFF. Таким образом, любой драйвер, использующий этот фильтр, ограничен этими форматами.

Чтобы создать дочерние элементы, фильтр сегментации вызывает метод IWiaItem2::CreateChildItem . Ниже приведен пример такого вызова:

lItemFlags = WiaItemTypeGenerated | WiaItemTypeTransfer | WiaItemTypeImage | WiaItemTypeFile |
 WiaItemTypeProgrammableDataSource;

lCreationFlags = COPY_PARENT_PROPERTY_VALUES;

pWiaItem2->CreateChildItem(lItemFlags,
                           lCreationFlags,
                           bstrItemName,
                           &pChildItem);

IWiaItem2::CreateChildItem немного отличается от IWiaItem::CreateChildItem. Метод IWiaItem2::CreateChildItem имеет новый параметр lCreationFlags; Параметр lItemFlags метода IWiaItem2::CreateChildItem соответствует параметру lFlagsобъекта IWiaItem::CreateChildItem. Передача COPY_PARENT_PROPERTY_VALUES с параметром lCreationFlags в службу WIA, как показано в предыдущем фрагменте кода, указывает службе WIA задать все доступные для чтения и записи свойства WIA дочернего элемента те же значения, что и у родительского элемента. Фильтр сегментации должен передавать этот флаг, чтобы гарантировать, что свойства, такие как формат изображения и разрешение во вновь созданном дочернем элементе, являются родительским элементом. Важно, чтобы разрешение было одинаковым, так как свойства экстента, которые фильтр сегментации будет устанавливать для дочернего элемента, зависят от разрешения изображения. Кроме того, важно, чтобы формат и разрешение изображения в дочернем элементе совпадали, если приложение хочет использовать компонент предварительной версии (описано в документации по Microsoft Windows SDK). Перед получением окончательного изображения приложение может изменить разрешение, чтобы получить изображение более высокого качества из сканера.

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

Обратите внимание, что фильтр сегментации не отвечает за очистку созданных дочерних элементов. Поэтому если приложение вызывает IWiaSegmentationFilter::D etectRegions несколько раз, приложение должно сначала удалить дочерние элементы, созданные при первом вызове метода IWiaSegmentationFilter::D etectRegions . Фильтр сегментации также не отвечает за сброс параметра pInputStream . Приложение должно убедиться, что оно настроило указатель поиска на начало потока, прежде чем вызывать фильтр сегментации.

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

Если драйвер поставляется с фильтром сегментации, он должен реализовать свойство WIA_IPS_SEGMENTATION для элементов WIA с планшетами и пленкой. Это свойство только для чтения имеет два допустимых значения: WIA_USE_SEGMENTATION_FILTER и WIA_DONT_USE_SEGMENTATION_FILTER, которые задает драйвер. Это свойство позволяет приложению узнать, следует ли использовать фильтр сегментации драйвера для обнаружения регионов для определенного элемента.

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

Поскольку элемент WIA передается в IWiaSegmentationFilter::D etectRegions, фильтр сегментации может использовать различные алгоритмы в зависимости от категории элемента, т. е. плоского или пленки. Категория элемента хранится в свойстве WIA_IPA_ITEM_CATEGORY .

Если приложение изменяет какие-либо свойства в pWiaItem2 в период между получением изображения в pInputStream и вызовом приложения IWiaSegmentationFilter::D etectRegions, необходимо восстановить исходные параметры свойства (т. е. параметры свойства элемента при получении потока). Это можно сделать с помощью методов IWiaPropertyStorage::GetPropertyStream и IWiaPropertyStorage::SetPropertyStream . Причина, по которой эти изменения необходимо восстановить, заключается в том, что в элементе WIA могут быть сведения, необходимые для фильтра сегментации, но не сохраненные в заголовке образа. Примерами таких сведений являются данные, хранящиеся в свойствах WIA_IPS_XPOS, WIA_IPS_YPOS и WIA_IPS_ROTATION . Интерфейс IWiaPropertyStorage и его методы описаны в документации windows SDK.

Приложение получает экземпляр фильтра сегментации путем вызова IWiaItem2::GetExtension (описано в документации по Windows SDK). Приложение обычно вызывает этот метод перед отображением окна предварительного просмотра. Это связано с тем, что драйвер может не поставиться с фильтром сегментации. В этом случае пользовательский интерфейс не должен отображать неподдерживаемую кнопку, например Выполнить сегментацию.