IWiaPreview::GetNewPreview 方法

在内部缓存从驱动程序返回的未筛选映像。

语法

HRESULT GetNewPreview(
  [in] IWiaItem2            *pWiaItem2,
  [in] LONG                 lFlags,
  [in] IWiaTransferCallback *pWiaTransferCallback
);

参数

pWiaItem2 [in]

类型: IWiaItem2*

指定指向图像的 IWiaItem2 项的指针。

lFlags [in]

类型: LONG

当前未使用。 应设置为零。

pWiaTransferCallback [in]

类型: IWiaTransferCallback*

指定指向调用应用程序的 IWiaTransferCallback 接口的 指针。

返回值

类型: HRESULT

如果此方法成功,则返回 S_OK。 否则,它将返回 HRESULT 错误代码。

备注

应用程序必须先调用 IWiaPreview::GetNewPreview ,然后才能调用 IWiaPreview::D etectRegions

IWiaPreview::GetNewPreview 设置 WIA_DPS_PREVIEW 属性 (,并在返回之前重置它,除非在) 之前设置。 这使驱动程序和硬件以及图像处理筛选器知道该项目是预览扫描。

在内部,Windows 映像采集 (WIA) 2.0 预览组件通过在 pWiaItem2 上调用 GetExtension 来创建驱动程序的图像处理筛选器的实例。 当应用程序调用 IWiaPreview::GetNewPreview 时,WIA 2.0 预览组件会执行此操作。 WIA 2.0 预览组件还会初始化 IWiaPreview::GetNewPreview 中的筛选器。 在调用 IWiaPreview::UpdatePreview 期间,WIA 2.0 预览组件使用相同的筛选器实例。

在调用 WIA 2.0 预览组件之前,应用程序应调用 CheckExtension ,以确保驱动程序附带图像处理筛选器。 它应对传递给 IWiaPreview::GetNewPreview 的项调用 CheckExtension。 在没有图像处理筛选器的情况下提供实时预览是无用的。 如果应用程序为没有图像处理筛选器的驱动程序调用 IWiaPreview::GetNewPreview ,则调用将失败。

示例

CheckImgFilter 检查驱动程序是否具有图像处理筛选器。 在调用预览组件之前,应用程序应确保驱动程序具有图像处理筛选器。

HRESULT
CheckImgFilter(
   IN  IWiaItem2 *pWiaItem2,
   OUT BOOL      *pbHasImgFilter)
{
   HRESULT     hr = S_OK;

   if (!pWiaItem2 || !pbHasImgFilter)
   {
      hr = E_INVALIDARG;
   }

   if (SUCCEEDED(hr))
   {
     *pbHasImgFilter = FALSE;
   }

   if (SUCCEEDED(hr))
   {
      BSTR    bstrFilterString = SysAllocString(WIA_IMAGEPROC_FILTER_STR);

      if (bstrFilterString)
      {
         hr = pWiaItem2->CheckExtension(0,
                                        bstrFilterString,
                                        IID_IWiaSegmentationFilter,
                                        pbHasImgFilter);

         SysFreeString(bstrFilterString);
         bstrFilterString = NULL;
      }
      else
      {
         hr = E_OUTOFMEMORY;
      }
   }

   return hr;

}

DownloadPreviewImage 通过调用预览组件的 IWiaPreview::GetNewPreview 方法从扫描程序下载图像数据。 然后,如果应用程序用户想要调用分段筛选器,它会调用 DetectSubregions,该筛选器会在 pWiaItem2 下为其检测到的每个区域创建一个子项。 有关此示例中使用的 DetectSubregions 方法,请参阅 DetectRegions。

在此示例中,应用程序用户通过单击检查框进行设置m_bUseSegmentationFilter。 如果应用程序支持此功能,它应首先通过调用 CheckExtension 检查驱动程序具有分段筛选器。 有关 CheckImgFilter 方法示例,请参阅 IWiaPreview::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 segmentation filter, however, if the driver
         // comes with one (omitted here).
      }
   }

   return hr;
}

要求

要求
最低受支持的客户端
Windows Vista [仅限桌面应用]
最低受支持的服务器
Windows Server 2008 [仅限桌面应用]
标头
Wia.h
IDL
Wia.idl