IWiaSegmentationFilter::D etectRegions 方法
決定在平面分板上配置影像的子領域,讓每個子領域都可以取得到個別的影像專案。
語法
HRESULT DetectRegions(
[in] LONG lFlags,
[in] IStream *pInputStream,
[in] IWiaItem2 *pWiaItem2
);
參數
-
lFlags [in]
-
類型: LONG
目前未使用。 應該設定為零。
-
pInputStream [in]
-
類型: IStream*
指定 IStream 預覽影像的指標。
-
pWiaItem2 [in]
-
類型: IWiaItem2*
指定取得 pInputStream之IWiaItem2專案的指標。 分割篩選會為此專案建立子專案。
傳回值
類型: HRESULT
如果此方法成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。
備註
這個方法會決定 pInputStream 所代表之影像的子領域。 針對偵測到的每個子領域,它會為pWiaItem2參數中指定的IWiaItem2專案建立子專案。 針對每個子專案,分割篩選準則必須使用下列 掃描器 WIA 專案屬性常數,設定要掃描區域周框的值。
如果驅動程式支援反扭曲,更進階的篩選可能也需要其他 掃描器 WIA 專案屬性常數 ,例如 WIA_IPS_DESKEW_X 和 WIA_IPS_DESKEW_Y。
如果應用程式多次呼叫 IWiaSegmentationFilter::D etectRegions ,應用程式必須先刪除 上次呼叫 IWiaSegmentationFilter::D etectRegions所建立的子專案。
如果應用程式將任何屬性變更為 pWiaItem2,在取得映射至 pInputStream 與其 對 IWiaSegmentationFilter::D etectRegions的呼叫之間,原始屬性 (也就是必須還原專案取得資料流程時所擁有的屬性) 。 這可以透過 GetPropertyStream 和 SetPropertyStream來完成。
如果應用程式呼叫將相同的資料流程傳遞至分割篩選多次,則必須重設 IStream 。 應用程式也必須在初始下載之後重設資料流程,以及在呼叫 IWiaSegmentationFilter::D etectRegions之前重設資料流程。
範例
分割會對傳入 DetectSubregions 的資料流程執列區域偵測 (pImageStream
) 。 請參閱此範例中使用的 CreateSegmentationFilter 方法的 GetExtension 。
HRESULT
DetectSubregions(
IN IStream *pImageStream,
IN IWiaItem2 *pWiaItem2)
{
HRESULT hr = S_OK;
IWiaSegmentationFilter* pSegmentationFilter = NULL;
if (!pWiaItem2 || !pImageStream)
{
hr = E_INVALIDARG;
}
if (SUCCEEDED(hr))
{
hr = CreateSegmentationFilter(pWiaItem2, &pSegmentationFilter);
}
if (SUCCEEDED(hr))
{
hr = pSegmentationFilter->DetectRegions(0,pImageStream, pWiaItem2);
}
if (pSegmentationFilter)
{
pSegmentationFilter->Release();
pSegmentationFilter = NULL;
}
return hr;
}
DownloadPreviewImage 會藉由呼叫預覽元件的 GetNewPreview 方法,從掃描器下載影像資料。 然後它會呼叫 DetectSubregions,如果應用程式使用者想要叫用分割篩選,這會針對偵測到的每個區域建立 pWiaItem2 下的子專案。 如需此範例中使用的 DetectSubregions 方法,請參閱 IWiaSegmentationFilter::D etectRegions 。
在此範例中,應用程式使用者按一下核取方塊來設定 m_bUseSegmentationFilter
。 如果應用程式支援此功能,則應該先呼叫 CheckExtension來檢查驅動程式是否有分割篩選。 如需 CheckImgFilter 方法範例,請參閱 GetNewPreview ,以瞭解如何完成此作業。
HRESULT
DownloadPreviewImage(
IN IWiaItem2 *pWiaFlatbedItem2)
{
HRESULT hr = S_OK;
BOOL bHasImgFilter = FALSE;
IWiaTransferCallback *pAppWiaTransferCallback = NULL;
hr = CheckImgFilter(pWiaFlatbedItem2, &bHasImgFilter)
if (SUCCEEDED(hr))
{
if (bHasImgFilter)
{
IWiaPreview *pWiaPreview = NULL;
// In this example, the AppWiaTransferCallback class implements
// the IWiaTransferCallback interface.
// The constructor of AppWiaTransferCallback sets the reference count
// to 1.
pAppWiaTransferCallback = new AppWiaTransferCallback();
hr = pAppWiaTransferCallback ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// Acquire image from scanner
hr = m_pWiaPreview->GetNewPreview(pWiaFlatbedItem2,
0,
pAppWiaTransferCallback);
}
//
// Check the application UI for whether the user wants
// to use the segmentation filter indicated by the value
// of m_bUseSegmentationFilter.
//
// m_FlatbedPreviewStream is the stream that
// AppWiaTransferCallback::GetNextStream returned for the
// flatbed item.
// This stream is where the image data is stored after
// the successful return of GetNewPreview.
// The stream is passed into the segmentation filter
// for region detection.
if (SUCCEEDED(hr) && m_bUseSegmentationFilter)
{
DetectSubregions(m_FlatbedPreviewStream, pWiaFlatbedItem2);
}
if (pAppWiaTransferCallback)
{
// If the call to GetNewPreview was successful, the
// preview component calls AddRef on the callback so
// this call doesn't delete the object.
pAppWiaTransferCallback->Release();
}
}
else
{
// Do not create an instance of preview component if the driver
// does not come with an image-processing filter.
// You can use a segmentation filter, however, if the driver
// comes with one (omitted here).
}
}
return hr;
}
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 |
Windows Server 2008 [僅限傳統型應用程式] |
標頭 |
|
Idl |
|