分段筛选器的接口

从 Windows Vista 开始,WIA 将支持分段筛选器。 分段筛选器必须实现 IWiaSegmentationFilter 接口

IWiaSegmentationFilter 接口依赖于 Windows Vista 的新 () 接口 IWiaItem2(在本部分使用)是 IWiaItem 的超集。 除了 IWiaItem 方法外, IWiaItem2 接口还包括方法 IWiaItem2::GetExtension,应用程序使用它来创建 WIA 扩展,包括分段筛选器。 Microsoft Windows SDK文档中介绍了 IWiaItemIWiaItem2 接口。

IWiaSegmentationFilter 接口实现单个方法 DetectRegions。 此方法有三个参数: lFlagspInputStreampWiaItem2

lFlags 参数当前未使用。

pInputStream 参数是指向要对其执行分段的图像的指针。 通常,这是一个预览图像,表示平板的整个扫描表面。 流由应用程序在其 IWiaTransferCallback::GetNextStream 方法中创建;在图像获取期间调用此方法。 驱动程序将获取的图像数据写入 IWiaTransferCallback::GetNextStream 方法返回的流中。 这也是应用程序应传递到分段筛选器的流。 Windows SDK 文档中介绍了 IWiaTransferCallback 接口。

pWiaItem2 参数是指向为其获取 pInputStream 的 WIA 项的指针。 它也称为父项。 例如, pWiaItem2 指向的项可能是平板项。

IWiaSegmentationFilter::D etectRegions 方法用于确定 pInputStream 表示的图像的子区域。 对于检测到的每个子区域, IWiaSegmentationFilter::D etectRegions 会在 pWiaItem2 指向的项下创建新的子 WIA 项。 对于每个子项,分段筛选器必须设置以下 WIA 属性的值: WIA_IPS_XPOSWIA_IPS_YPOSWIA_IPS_XEXTENTWIA_IPS_YEXTENT。 这些属性表示要扫描的区域的边框。 更高级的分段筛选器可能还需要设置其他 WIA 属性,例如,如果驱动程序支持偏置,则 为分段筛选器设置 WIA 属性

下图显示了分段筛选器如何修改应用程序项树。 在此图中,分段筛选器在平板上检测到三个图像,并且对于每个图像,它已在平板项目下创建了一个新的子项。

说明分段筛选器如何修改应用程序项树的示意图。

分段筛选器必须支持它扩展的驱动程序支持的所有图像格式。 Microsoft 提供的分段筛选器支持 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::CreateChildItemIWiaItem::CreateChildItem 略有不同。 IWiaItem2::CreateChildItem 方法具有新参数 lCreationFlags;IWiaItem2::CreateChildItem 方法的 lItemFlags 参数对应于 IWiaItem::CreateChildItemlFlags 参数。 将具有 lCreationFlags 参数的COPY_PARENT_PROPERTY_VALUES传递给 WIA 服务(如前面的代码片段所示),告知 WIA 服务将子项的所有可读/可写 WIA 属性设置为与其父项相同的值。 分段筛选器应传递此标志的原因是确保新创建的子项中的图像格式和分辨率等属性作为父项。 分辨率相同非常重要,因为分段筛选器将设置为子项的盘区属性取决于图像的分辨率。 如果应用程序想要使用Microsoft Windows SDK文档) 中所述的预览组件 (,则子项中的图像格式和分辨率也很重要。 在获取最终图像之前,应用程序可以修改分辨率,以便从扫描仪获取更高质量的图像。

请务必注意,分段筛选器在可以和不能执行的操作方面受到与应用程序相同的限制。 这意味着应用程序可以修改分段筛选器创建的子项。 例如,用户可能对分段筛选器检测到的区域不满意,并可能通过拖动其角来告知应用程序修改此区域。 应用程序还可以删除分段筛选器创建的子项,以及添加新项。

请注意,分段筛选器不负责“清理”它创建的子项。 因此,如果应用程序多次调用 IWiaSegmentationFilter::D etectRegions ,则应用程序必须首先删除在首次调用 IWiaSegmentationFilter::D etectRegions 方法中创建的子项。 分段筛选器也不负责重置 pInputStream 参数。 应用程序必须确保在调用分段筛选器之前,已将查找指针设置为流开头。

分段筛选器应仅用于胶片项和平板项目。 对于胶片扫描,扫描仪通常附带固定帧,在这种情况下,驱动程序创建子项 (请参阅 WIA 扫描仪项目树布局 ,了解) 的详细信息。 在这种情况下,应用程序不应调用分段筛选器进行区域检测和子项创建。

如果驱动程序附带分段筛选器,则应为其平板和胶片 WIA 项实现 WIA_IPS_SEGMENTATION 属性。 此只读属性有两个有效值:WIA_USE_SEGMENTATION_FILTER 和 WIA_DONT_USE_SEGMENTATION_FILTER,驱动程序设置这些值。 此属性可让应用程序知道它是否应使用驱动程序分段筛选器来检测特定项的区域。

如果扫描仪使用固定帧进行胶片扫描,则会将此属性设置为胶片项中的WIA_DONT_USE_SEGMENTATION_FILTER。 在这种情况下,应用程序不应在获取电影预览后尝试加载分段筛选器;相反,它应枚举驱动程序创建的子项。 这些子项表示固定帧。

由于 WIA 项已传递到 IWiaSegmentationFilter::D etectRegions 中,因此分段筛选器可以根据项目的类别(即平板或胶片)使用不同的算法。 项的类别存储在 WIA_IPA_ITEM_CATEGORY 属性中。

如果应用程序在获取 pInputStream 中的图像和应用程序调用 IWiaSegmentationFilter::D etectRegions 之间更改 pWiaItem2 中的任何属性,则必须还原原始属性设置 (即项目在获取流) 时具有的属性设置。 这可以使用 IWiaPropertyStorage::GetPropertyStreamIWiaPropertyStorage::SetPropertyStream 方法完成。 需要还原这些更改的原因是 WIA 项中可能存在分段筛选器所需的信息,但未存储在图像标头中。 此类信息的示例包括存储在 WIA_IPS_XPOSWIA_IPS_YPOSWIA_IPS_ROTATION 属性中的数据。 Windows SDK 文档中介绍了 IWiaPropertyStorage 接口及其方法。

应用程序通过调用 IWiaItem2::GetExtension ((如 Windows SDK 文档) 中所述)来获取分段筛选器的实例。 应用程序通常会在显示其预览窗口之前调用此方法。 这是因为驱动程序可能不附带分段筛选器,在这种情况下,UI 应该知道不显示不受支持的按钮,例如 执行分段