wia twain for java,c – 使用WIA或TWAIN扫描页面

编辑:有没有关于如何在c中使用WIA或TWAIN的教程,解释如何扫描页面,调整设置(DPI,使用自动进纸器等)并将它们保存为PNG文件?

我想使用WIA扫描页面并将它们存储为png文件.如果扫描仪支持自动送纸,我也想使用该功能.目前我正在按照this教程的步骤进行操作,并坚持使用WIA 2.0中的传输图像数据部分.

到目前为止,我的扫描仪已经找到并且我能够创建设备,并且已经创建了IWiaItem2 *.怎么用它来扫描300dpi并将结果存储为png文件?

本教程不清楚如何开始扫描过程或如何设置扫描的dpi,所以我希望有人可以帮我解决这些问题.

这本质上是获取所有本地设备的代码:

bool init(IWiaDevMgr2* devMgr)

{

//creating the device manager

*devMgr = 0;

CoCreateInstance( CLSID_WiaDevMgr2, 0, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr2, (void**)&devMgr);

//enumerating wia devices

IEnumWIA_DEV_INFO* enumDevInfo = 0;

HRESULT hr = devMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_LOCAL, &enumDevInfo);

if(SUCCEEDED(hr))

{

//loop until an error occurs or end of list

while(hr == S_OK)

{

IWiaPropertyStorage* storage = 0;

hr = enumDevInfo->Next( 1, &storage, 0);

if(hr == S_OK)

{

readProperties(storage);

storage->Release();

storage = 0;

}

}

//set hr to ok, so no error code is returned

if(hr == S_FALSE) hr = S_OK;

enumDevInfo->Release();

enumDevInfo = 0;

}

return SUCCEEDED(hr);

}

void readProperties(IWiaPropertyStorage* storage)

{

PROPSPEC propSpec[2] = {0};

PROPVARIANT propVar[2] = {0};

const ULONG propCount = sizeof(propSpec) / sizeof(propSpec[0]);

propSpec[0].ulKind = PRSPEC_PROPID;

propSpec[0].propid = WIA_DIP_DEV_ID;

propSpec[1].ulKind = PRSPEC_PROPID;

propSpec[1].propid = WIA_DIP_DEV_NAME;

HRESULT hr = storage->ReadMultiple(propCount, propSpec, propVar);

if(SUCCEEDED(hr))

{

Device* dev = new Device(propVar[0].bstrVal, propVar[1].bstrVal);

devices.push_back( dev );

FreePropVariantArray( propCount, propVar );

}

}

之后,设备初始化如下:

bool createDevice(BSTR id, IWiaItem2** item)

{

*item = 0;

HRESULT hr = devMgr->CreateDevice( 0, deviceId, item);

return SUCCEEDED(hr);

}

然后枚举项目:

bool enumerateItems(IWiaItem2* item)

{

LONG itemType = 0;

HRESULT hr = item->GetItemType(&itemType);

if(SUCCEEDED(hr))

{

if(itemType & WiaItemTypeFolder || itemType & WiaItemTypeHasAttachments)

{

IEnumWiaItem2* enumItem = 0;

hr = item->EnumChildItems(0, &enumItem );

while(hr == S_OK)

{

IWiaItem2* child = 0;

hr = enumItem->Next( 1, &child, 0 );

if(hr == S_OK)

{

hr = enumerateItems( child );

child->Release();

child = 0;

}

}

if(hr == S_FALSE) hr = S_OK;

enumItem->Release();

enumItem = 0;

}

}

return SUCCEEDED(hr);

}

现在一切都已初始化,我想实现一个扫描功能.但是,本教程中提供的代码用于传输文件和文件夹,而不用于扫描图像.

void scanAndSaveAsPNG(IWiaItem2* item, unsigned int dpi, std::string targetPath)

{

}

编辑:

我安装了扫描仪驱动程序(WIA和TWAIN)的最新版本,并在使用此代码检查支持的命令后

void printCommands(IWiaItem2* i)

{

IEnumWIA_DEV_CAPS* caps = 0;

HRESULT h = item->EnumDeviceCapabilities(WIA_DEVICE_COMMANDS, &caps);

if(SUCCEEDED(h))

{

ULONG count = 0;

caps->GetCount(&count);

if(count > 0)

{

WIA_DEV_CAP* cap = new WIA_DEV_CAP[ count ];

ULONG fetched;

caps->Next(count, cap, &fetched);

for(int i = 0; i < fetched; i++)

{

std::cout << bstr_t( cap[i].bstrName ) << "\n";

}

}

caps->Release();

}

}

我注意到它只列出了WIA Synchronize命令.我不确定我是否没有正确初始化设备,或者设备是否支持所有WIA命令,尽管安装了驱动程序.

因此,除非这个问题得到解决,否则我也会根据TWAIN寻找相同的代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值