我正在尝试使用WIA (Microsoft Windows Image Acquisition Library v2.0) 在Vista平台上运行的VS2008中构建一个C#3.5 WinForms应用程序,以便从扫描仪中获取图像。
我知道有很多SDK可以做到这一点(Accusoft,ByteScout,Knowledge Lake等),但我们想要对UI(或缺乏)进行一些控制,并能够自定义图像的处理和处理这就是我们尝试WIA角度的原因。
但是,我无法让WIA“看到”我的扫描仪。
VS项目中引用了“Microsoft Windows Image Acquisition Library v2.0”dll,我已经包含了“使用WIA”;在页面顶部。
以下是代码部分:
//Choose Scanner
CommonDialogClass class1 = new CommonDialogClass();
Device d = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);
if (d != null)
{
this.DeviceID = d.DeviceID;
}
else
{
//no scanner chosen
return;
}
符合条件,但第2行(设备d = ... )在运行时会出现以下错误:
来自HRESULT的异常:0x80210015
据我所知,这通常意味着您的设备已拔下/未开启或设备未与WIA兼容。
但是有问题的扫描仪出现在控制面板/扫描仪和相机中(意味着它与WIA兼容),并且在通过Photoshop访问时工作(意味着它已打开)。
我已插入其他设备(数码单反相机),上面的代码可以“看到”它们,因此代码正常工作。
有没有人对出现问题以及如何解决问题有任何建议?
更新1 :
我尝试了几种不同的扫描仪(Canon 5000F,Benq 5250C),但同样的问题。
更新2 :
我一直无法找到这方面的明确证据,但我认为我一直在测试的扫描仪,或者可能大多数扫描仪:(,不是WIA兼容/支持。我就是现在正在考虑使用TWAIN,但仍然希望听到任何与WIA取得一些成功的人。
更新3 : 结束了WIA并使用.NET Twain SDK(EZTwain)。现在全部排序。感谢大家的投入。
答案 0 :(得分:2)
我认为您的扫描仪不支持WIA
。我建议使用大多数供应商支持的TWAIN。
我建议使用 NTWAIN 库:
Nuget Pakcage: https://www.nuget.org/packages/NTwain/
答案 1 :(得分:0)
答案 2 :(得分:0)
只连接扫描仪时,我会尝试以下代码
IDeviceManager dm = ClassFactory.createDeviceManager();
System.out.println(dm.deviceInfos().count());
如果设备管理员可以完全看到您的扫描仪
答案 3 :(得分:0)
wiaImage = wiaDiag.ShowAcquireImage(WiaDeviceType.ScannerDeviceType, WiaImageIntent.GrayscaleIntent, WiaImageBias.MaximizeQuality, wiaFormatJPEG, true, true, false);
WIA.Vector vector = wiaImage.FileData;
FileExtention = wiaImage.FileExtension;
Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));
pbPreview1.Image = i;//to show preview of scanned image in picturebox
答案 4 :(得分:0)
这是我测试WIA扫描仪的方法:
private bool WIAScannerTest()
{
try
{
WIA.CommonDialog wiaObj = New WIA.CommonDialog();
WIA.Device wiaDev =
wiaObj.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, false, false);
return true;
}
catch (Exception ex)
{}
finally
{
if(wiaDev != null)
{
Marshal.ReleaseComObject(wiaDev)
wiaDev = null;
}
if(wiaObj != null)
{
Marshal.ReleaseComObject(wiaObj)
wiaObj = null;
}
}
return false;
}
答案 5 :(得分:0)
ICommonDialog dialog = new CommonDialog();
Device device = dialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);
作为替代方案。
答案 6 :(得分:0)
最有可能的是,没有为设备安装WIA驱动程序。我建议您应该使用TWAIN,几乎所有供应商都支持。
有很多开源以及商用TWAIN包装。 Most of them work for 32bit applications and 64bit applications fail to access 32bit TWAIN drivers。如果您需要同时支持 64位和32位 WinForms WPF应用程序,则可以考虑使用Asprise C# VB.NET scanning for twain wia scanner。