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 [仅限桌面应用] |
标头 |
|
IDL |
|