分割篩選的介面
從 Windows Vista 開始,WIA 將支援分割篩選。 分割篩選準則必須實作 IWiaSegmentationFilter 介面。
IWiaSegmentationFilter介面相依于 Windows Vista) 介面IWiaItem2的新 (,此區段是IWiaItem的超集合。 除了IWiaItem 方法之外,IWiaItem2介面還包含IWiaItem2::GetExtension方法,由應用程式用來建立 WIA 延伸模組,包括分割篩選。 Microsoft Windows SDK檔中會說明IWiaItem和IWiaItem2介面。
IWiaSegmentationFilter介面會實作單一方法DetectRegions。 這個方法有三個參數: lFlags、 pInputStream和 pWiaItem2。
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_XPOS、 WIA_IPS_YPOS、 WIA_IPS_XEXTENT和 WIA_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::CreateChildItem 與 IWiaItem::CreateChildItem稍有不同。 IWiaItem2::CreateChildItem方法有新的參數lCreationFlags;IWiaItem2::CreateChildItemItem方法的lItemFlags參數會對應至IWiaItem::CreateChildItem的lFlags參數。 使用 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::GetPropertyStream 和 IWiaPropertyStorage::SetPropertyStream 方法來完成。 需要還原這些變更的原因是 WIA 專案中可能有分割篩選所需的資訊,但不會儲存在影像標頭中。 這類資訊的範例包括儲存在 WIA_IPS_XPOS、 WIA_IPS_YPOS和 WIA_IPS_ROTATION 屬性中的資料。 Windows SDK 檔中會說明 IWiaPropertyStorage 介面及其方法。
應用程式會呼叫 IWiaItem2::GetExtension (,以取得分割篩選的實例,如 Windows SDK 檔) 中所述。 應用程式通常會在顯示其預覽視窗之前呼叫這個方法。 這是因為驅動程式可能未隨附分割篩選,在此情況下,UI 應該不知道不會顯示不支援的按鈕,例如 執行分割。