为什么WIA看不到我的扫描仪?

时间:2010-03-10 01:29:05

标签: c# winforms wia image-scanner

我正在尝试使用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)。现在全部排序。感谢大家的投入。

7 个答案:

答案 0 :(得分:2)

我认为您的扫描仪不支持WIA。我建议使用大多数供应商支持的TWAIN。

我建议使用 NTWAIN 库:

Nuget Pakcage: https://www.nuget.org/packages/NTwain/

源代码: https://bitbucket.org/soukoku/ntwain

答案 1 :(得分:0)

查看有关TWAIN的CodeProject上的这篇文章。这可能会帮助你朝这个方向发展,另外,这是另一篇关于WIA的文章,尽管它虽然有点陈旧但值得一看。

答案 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