为什么WIA无法识别我的扫描仪?

25

我正在尝试使用 WIA(Microsoft Windows Image Acquisition Library v2.0) 来构建一个在Vista系统上运行的C# 3.5 WinForms应用程序,在VS2008中从扫描仪获取图像。

我知道有很多SDK可以完成这个任务(如Accusoft、ByteScout、Knowledge Lake等),但我们想要控制UI(或缺少UI)并能够自定义处理和处理图像,这就是为什么我们选择WIA的原因。

然而,我一直无法让WIA“看到”我的扫描仪。

在VS项目中引用了“Microsoft Windows Image Acquisition Library v2.0” dll,并在页面顶部包含了“using 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;
}

代码编译没问题,但是运行时第二行 (Device d = ...) 抛出以下错误:
Exception from HRESULT: 0x80210015

根据我的理解,这通常意味着你的设备未插好/未开启或该设备不支持 WIA。
但是所涉及的扫描仪在控制面板/扫描仪和相机中显示(表示它支持 WIA),并且在通过 Photoshop 访问时起作用(表示它已经开启)。

我已经插入其他设备(数码单反相机),以上代码可以“看到”它们,因此代码是有效的。

有没有人能提供关于出现问题原因和如何修复它的建议?

更新1:
我尝试了几个不同的扫描仪(Canon 5000F、Benq 5250C),但问题依旧。

更新2:
我一直无法找到确凿的证据,但我认为我测试过的扫描仪,或者也许是大多数扫描仪 :( ,都不支持 WIA。我现在正在考虑使用 TWAIN,但仍然希望听取任何曾经成功使用 WIA 的人的建议。

更新3:
最终放弃了 WIA 并使用了 .NET Twain SDK (EZTwain)。现在一切都解决了。感谢大家的帮助。


@Mitch。是的,我已经检查过了。我确保它拥有最新版本的驱动程序。而且在Photoshop中也没有问题。 - Dhaust
可能是使用WIA、C#和Win 7进行相机捕获的重复问题。 - Daniel A. White
7个回答

2

0
ICommonDialog dialog = new CommonDialog();
Device device = dialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, true, false);

作为一个替代选择。

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

0
当您只连接您的扫描仪时,我会尝试以下代码。
IDeviceManager dm = ClassFactory.createDeviceManager();
System.out.println(dm.deviceInfos().count());

如果设备管理器能够看到您的扫描仪


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;
}

0

看看这篇关于TWAIN的CodeProject文章。这可能会对你有所帮助,此外,这里还有另一篇关于WIA的文章,尽管它有点老但仍值得一看。


嗨Tommie,我在研究这个问题时看过这两个页面(并尝试运用了其中的代码)。然而,《Twain》文章是2001年的,甚至提到WIA作为更现代的方法。而《WIA》文章是关于WIA 1.0的,只适用于XP,我正在使用WIA 2.0,适用于Vista/Win7。但还是谢谢你。 - Dhaust

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接