分段筛选器的接口

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

IWiaSegmentationFilter 接口依赖于 Windows Vista) 接口 IWiaItem2 的新 (,该接口在本部分中使用,是 IWiaItem 的超集。 除了 IWiaItem 方法之外, IWiaItem2 接口还包括应用程序用来创建 WIA 扩展的方法 IWiaItem2::GetExtension,包括分段筛选器。 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 属性

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

diagram illustrating how the segmentation filter modifies the application item tree.

分段筛选器必须支持它扩展的驱动程序支持的所有图像格式。 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 接口及其方法。

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