次の方法で共有


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_IPS_DESKEW_XWIA_IPS_DESKEW_Yなど、他のスキャナー WIA 項目プロパティ定数も必要になる場合があります。

アプリケーションが 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 [デスクトップ アプリのみ]
Header
Wia.h
IDL
Wia.idl