在Vista上使用C#/WIA 2.0进行扫描

23

我想实现一个无纸化的归档系统,并打算使用C#中的WIA完成图像采集。CodeProject等网站上有很多示例项目,但是在我找到的每个项目中,都存在WIALib引用错误的问题。

当我尝试将"Microsoft Windows Image Acquisition"添加为引用时,我的开发工作站(也是运行该系统的机器)上只有2.0版本可用。

不幸的是,每个示例项目似乎都是针对1.x编码的。引用以"WIA"而非"WIALib"的形式进行。我曾经试过更改命名空间导入,但很明显API大不相同。

是否有任何关于实现v2.0或升级这些现有示例项目的信息?


快速问题。你绝对需要WIA吗?还是可以使用Twain?如果Twain可以的话,我可能有一些代码可以捐赠。 - Shawn Miller
5个回答

22

要访问WIA,您需要添加对COM库“Microsoft Windows Image Acquisition Library v2.0”(wiaaut.dll)的引用。

添加“using WIA;”

const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
CommonDialogClass wiaDiag = new CommonDialogClass();
WIA.ImageFile wiaImage = null;

wiaImage = wiaDiag.ShowAcquireImage(
        WiaDeviceType.UnspecifiedDeviceType, 
        WiaImageIntent.GrayscaleIntent, 
        WiaImageBias.MaximizeQuality, 
        wiaFormatJPEG, true, true, false);

WIA.Vector vector = wiaImage.FileData;

(System.Drawing)

Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));
i.Save(filename)

这是一种基本的方法,适用于我的平板/文档送纸器。如果您需要同时处理多个文档/页面,则可能有更好的方法来完成此操作(从我所看到的情况来看,这仅处理一个图像,尽管我不完全确定)。虽然它是一个WIA v1文档,但Scott Hanselman的Coding4Fun关于WIA的文章中包含了一些有关如何处理多个页面的信息,我想(我自己还没有深入研究过)。

如果用于无纸办公系统,您可能还想查看MODI(Office Document Imaging),以便为您执行所有OCR操作。


我会试一试。我不想用OCR,因为我还没有看到任何系统能够在我的东西上接近足够的准确度,以至于比起做一些不错的元数据和标记更有用。这应该给我大部分我需要的东西,一旦被引用,我就可以通过API进行挖掘。 - J Wynia
5
您可以使用 System.Drawing.Imaging.ImageFormat.Jpeg.Guid.ToString("B") 替代那个神奇的 GUID,这将使内容更加通俗易懂,但不会改变原本的意思。 - Lars
5
您可以使用Interop.WIA.dll中定义的GUID。FormatID.wiaFormatJPEG - Greg Dean
1
如果没有有效的WIA设备可用,上面的代码将抛出一个带有消息“Exception from HRESULT: 0x80210015”的异常。您可以使用以下代码检查设备:WIA.DeviceManagerClass wiaDM = new DeviceManagerClass(); if (wiaDM == null || wiaDM.DeviceInfos == null || wiaDM.DeviceInfos.Count == 0) // No devices - Steve Hiner

1

更新:我将其单独添加,因为它是不同的答案(一年后)。我了解到XP具有WIA 1.0,而Vista及以后版本具有WIA2.0。但是,您可以从此处安装适用于Windows XP Sp1+的WIA 2.0。

然后,我还使用在互联网上找到的代码制作了一个小库,它也具有扫描多个页面的功能: http://adfwia.codeplex.com/


1

0
另外注意:您需要从Microsoft.com下载WIA 2.0 dll,然后浏览到该dll并将其添加到您的项目中。

0

它不需要是WIA。我主要看的是WIA设置,因为它为不同的扫描仪提供了相同的基本接口。我在这台机器上有3个扫描仪,所有的TWAIN驱动程序/软件都很糟糕(比如在扫描过程中阻塞屏幕)。

对于文档管理,我真正需要的是简单的200dpi灰度扫描,所以大部分TWAIN驱动程序中的东西都是多余的。

话虽如此,在转向TWAIN之前,我在这里询问是我最后尝试弄清楚如何在WIA中实现它的一部分。


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