【发布时间】:2014-03-18 01:38:16
【问题描述】:
我正在开发一个应用程序,我的应用程序需要从扫描仪以图像格式获取输入。
这是一个 wpf 应用程序,扫描仪连接到系统,用户将文档放入扫描仪并打印应用程序中的按钮以扫描文档,然后应用程序必须将扫描的文档保存为系统中的图像。
我不想使用任何付费组件,我相信一定有某种内置方式可以从端口读取输入。
【问题讨论】:
标签: c# .net usb image-scanner
我正在开发一个应用程序,我的应用程序需要从扫描仪以图像格式获取输入。
这是一个 wpf 应用程序,扫描仪连接到系统,用户将文档放入扫描仪并打印应用程序中的按钮以扫描文档,然后应用程序必须将扫描的文档保存为系统中的图像。
我不想使用任何付费组件,我相信一定有某种内置方式可以从端口读取输入。
【问题讨论】:
标签: c# .net usb image-scanner
在我工作的地方,我们围绕 Windows 图像采集编写了一个自定义包装器。这是一个非常简单的示例,应该从用户选择的扫描仪中捕获它。
//Reference "Windows Image Acquisition Library v2.0" on the COM tab.
private void Button1_Click(object sender, EventArgs e)
{
var dialog = new WIA.CommonDialog();
var file = dialog.ShowAcquireImage(WIA.WiaDeviceType.ScannerDeviceType);
file.SaveFile("C:\Temp\WIA." + file.FileExtension);
}
如果您想在不显示任何对话框的情况下执行此操作,这里有一篇很棒的文章,其中一些代码整齐地组织在一个名为 WIAScanner 的类的静态函数中:http://miljenkobarbir.com/using-a-scanner-without-dialogs-in-net/
要使用文章中的代码,假设您有一个扫描仪并且只想使用那个扫描仪,或者您只想使用系统上的第一个扫描仪,您可以这样做:
private void Button1_Click(object sender, EventArgs e)
{
var scannerIds = WIAScanner.GetDevices();
if(scannerIds.Count > 0) {
var images = WIAScanner.Scan(scannerIds[0]);
//Process the images here.
}
}
我希望这会有所帮助。
【讨论】:
其实你有几个选择:
1) TWAIN
这是一个“规范软件和数字成像设备之间的通信”并在 LGPL 许可下运行的 API, 见Wikipedia 见Homepage
2) Windows 图像采集
这是微软专有的。 “WIA 平台使成像/图形应用程序能够与成像硬件进行交互,并使不同应用程序和扫描仪之间的交互标准化。”
3) 图像和扫描仪接口规范 (ISIS)
它为 .NET 应用程序提供了完整的 SDK,因此可能对您最有帮助,但它是付费解决方案, 见Wikipedia 见Homepage
4) 自己动手
如果您想自行创建通信层,您必须至少确保设备具有有效的 USB 驱动程序。要访问任何硬件,您必须引入非托管代码(即 c++),因为这些设备驱动程序中的大多数都提供 c++ API,这意味着为基本 IO 操作创建一个库,然后为您的应用程序创建一个 c# 包装器。
【讨论】: