共用方式為


IWiaSegmentationFilter::D etectRegions 方法

決定在平面分板上配置影像的子領域,讓每個子領域都可以取得到個別的影像專案。

語法

HRESULT DetectRegions(
  [in] LONG      lFlags,
  [in] IStream   *pInputStream,
  [in] IWiaItem2 *pWiaItem2
);

參數

lFlags [in]

類型: LONG

目前未使用。 應該設定為零。

pInputStream [in]

類型: IStream*

指定 IStream 預覽影像的指標。

pWiaItem2 [in]

類型: IWiaItem2*

指定取得 pInputStreamIWiaItem2專案的指標。 分割篩選會為此專案建立子專案。

傳回值

類型: HRESULT

如果此方法成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。

備註

這個方法會決定 pInputStream 所代表之影像的子領域。 針對偵測到的每個子領域,它會為pWiaItem2參數中指定的IWiaItem2專案建立子專案。 針對每個子專案,分割篩選準則必須使用下列 掃描器 WIA 專案屬性常數,設定要掃描區域周框的值。

如果驅動程式支援反扭曲,更進階的篩選可能也需要其他 掃描器 WIA 專案屬性常數 ,例如 WIA_IPS_DESKEW_XWIA_IPS_DESKEW_Y

如果應用程式多次呼叫 IWiaSegmentationFilter::D etectRegions ,應用程式必須先刪除 上次呼叫 IWiaSegmentationFilter::D etectRegions所建立的子專案。

如果應用程式將任何屬性變更為 pWiaItem2,在取得映射至 pInputStream 與其 對 IWiaSegmentationFilter::D etectRegions的呼叫之間,原始屬性 (也就是必須還原專案取得資料流程時所擁有的屬性) 。 這可以透過 GetPropertyStreamSetPropertyStream來完成。

如果應用程式呼叫將相同的資料流程傳遞至分割篩選多次,則必須重設 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 [僅限傳統型應用程式]
標頭
Wia.h
Idl
Wia.idl