基于WIA的扫描仪程序,QT编写的,调用WIA api获取扫描仪属性,控制扫描仪,WIA提供了自带界面的方法,因为要嵌入自己的程序,所以我没有使用WIA自带的界面,Demo在Github上面,Github自取。详细资料请看官方文档。
目录
- 简介
- 创建WIA设备管理器
- 枚举系统设备
- 读取设备属性
- 创建设备
- 传输图像数据
1.简介
Windows图像采集(WIA)是Windows操作系统家族中的静止图像采集平台,从Windows Millennium Edition(Windows Me)和Windows XP开始。WIA平台使成像/图形应用程序可以与成像硬件进行交互,并标准化不同应用程序和扫描仪之间的交互。这允许那些不同的应用程序与这些不同的扫描仪进行对话并交互,而无需应用程序编写器和扫描仪制造商针对每种应用程序-设备组合自定义其应用程序或驱动程序。
- Windows为WIA驱动程序运行认证过程,因此,可以确保WIA应用程序与所有基于WIA的扫描仪基本兼容。
- WIA驱动程序已加载到WIA服务进程中,从而提供了更稳定的驱动程序环境。
- 可以通过WIA子系统支持的推送事件从扫描仪扫描按钮启动应用程序。
- WIA包括所有驱动程序都可以利用的默认分段过滤器;这样,应用程序不必为进行多区域扫描而编写代码,而无需将诸如散布在平板扫描仪上的大量照片分离出来的目的。
2.创建WIA设备管理器
使用Windows Image Acquisition(WIA)服务的第一步是获取IWiaDevMgr接口指针,CLSID_WiaDevMgr和IID_IWiaDevMgr是WIA常数表示类ID和的接口ID IWiaDevMgr分别。CoCreateInstance调用的dwClsContext参数的值必须为CLSCTX_LOCAL_SERVER。
IWiaDevMgr *pWiaDevMgr = nullptr;
HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr );
3.枚举系统设备
使用IWiaDevMgr :: EnumDeviceInfo方法来枚举系统上安装的Windows Image Acquisition(WIA)设备。此方法为设备的属性创建一个枚举对象,并返回一个指向该枚举对象支持的IEnumWIA_DEV_INFO接口的指针。然后,可以使用IEnumWIA_DEV_INFO接口的方法来获取系统上安装的每个设备的IWiaPropertyStorage接口指针。
IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL;
HRESULT hr = pWiaDevMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_ALL, &pWiaEnumDevInfo );
if (SUCCEEDED(hr))
{
// Loop until you get an error or pWiaEnumDevInfo->Next returns
// S_FALSE to signal the end of the list.
while (S_OK == hr)
{
// Get the next device's property storage interface pointer
IWiaPropertyStorage *pWiaPropertyStorage = NULL;
hr = pWiaEnumDevInfo->Next( 1, &pWiaPropertyStorage, NULL );
//..................接下来是获取设备信息并且创建设备,见第4节与第5节
}
}
4.读取设备属性
IWiaPropertyStorage接口读取和写入设备属性,设备属性包括有关设备的信息,这些信息描述了设备的功能和设置。有关这些属性的列表,请参见设备属性。
PROPSPEC PropSpec[3] = {0};
PROPVARIANT PropVar[3] = {0};
//
// How many properties are you query