使用适用于 Windows 和 Linux 的 .NET 控制台应用程序扫描图像

博客类别:TWAIN.NET

2024/04/08

TWAIN 是一种标准协议和接口 (API),用于定义程序和图像扫描仪之间的交互。TWAIN 标准由 TWAIN 工作组开发。TWAIN 标准版本 1 定义了与 Windows 系统下图像扫描仪的交互。TWAIN 标准版本 2 定义了与 Windows、macOS 和 Linux 系统下图像扫描仪的交互。
TWAIN标准是Windows系统下图像扫描仪最流行的标准。几乎所有图像扫描仪都有适用于Windows系统的TWAIN驱动程序。
TWAIN 标准在 Linux 中并不流行,我们的研究(截至 2024 年初)表明,只有柯达公司提供 TWAIN 驱动程序,以便在 Linux 中使用其图像扫描仪。

SANE 是一个应用程序编程接口 (API),它为光栅图像扫描设备(平板扫描仪、手持扫描仪等)提供标准化的访问方式。SANE API 属于公共领域,欢迎公众参与讨论和开发。SANE API 是 Linux 系统上最流行的图像扫描仪 API。
许多扫描仪制造商都为其图像扫描仪开发了 SANE 驱动程序。此外,SANE 社区也创建了 SANE 驱动程序。因此,几乎所有现代图像扫描仪都配备了 SANE 驱动程序,使您能够在 Linux 系统中使用该设备。

VintaSoft Twain .NET SDK 是一个专业的图像扫描库,允许控制 TWAIN 或 SANE 扫描仪并获取图像。适用于 Windows 和 Linux 的 .NET 应用程序。采集到的图像可以进行预处理并保存到文件,或上传到 HTTP(S) 或 FTP 服务器。

VintaSoft Twain .NET SDK 提供 VintaSoft TWAIN .NET API,用于在 Windows 和 Linux 系统中操作 TWAIN 设备。此外,VintaSoft Twain .NET SDK 还提供 VintaSoft SANE .NET API,用于在 Linux 系统中操作 SANE 设备。有关 VintaSoft TWAIN .NET API 和 VintaSoft SANE .NET API 的详细信息,请参阅此处的 .NET 开发人员文档:https://www.vintasoft.com/docs/vstwain-dotnet/

以下 C# 代码展示了如何在 Windows 和 Linux 系统中从 TWAIN 图像扫描仪获取图像:
/// <summary>
/// Synchronously acquire images images from TWAIN scanner.
/// </summary>
public void SynchronouslyAcquireImagesFromTwainScanner()
{
    try
    {
        using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
        {
            // open the device manager
            deviceManager.Open();

            // get reference to the default device
            Vintasoft.Twain.Device device = deviceManager.DefaultDevice;

            // open the device
            device.Open();

            // set acquisition parameters
            device.TransferMode = Vintasoft.Twain.TransferMode.Memory;
            device.ShowUI = false;
            device.DisableAfterAcquire = true;
            device.PixelType = Vintasoft.Twain.PixelType.BW;

            // create directory for PDF document
            string directoryForImages = System.IO.Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory());
            directoryForImages = System.IO.Path.Combine(directoryForImages, "Images");
            if (!System.IO.Directory.Exists(directoryForImages))
                System.IO.Directory.CreateDirectory(directoryForImages);

            string pdfFilename = System.IO.Path.Combine(directoryForImages, "multipage.pdf");

            // acquire image(s) from the device
            Vintasoft.Twain.AcquireModalState acquireModalState = Vintasoft.Twain.AcquireModalState.None;
            int imageIndex = 0;
            do
            {
                acquireModalState = device.AcquireModal();
                switch (acquireModalState)
                {
                    case Vintasoft.Twain.AcquireModalState.ImageAcquired:
                        // save image to file
                        device.AcquiredImage.Save(pdfFilename);
                        // dispose acquired image
                        device.AcquiredImage.Dispose();
                        // output current state
                        System.Console.WriteLine(string.Format("Image{0} is saved.", imageIndex++));
                        break;

                    case Vintasoft.Twain.AcquireModalState.ScanCompleted:
                        // output current state
                        System.Console.WriteLine("Scan completed.");
                        break;

                    case Vintasoft.Twain.AcquireModalState.ScanCanceled:
                        // output current state
                        System.Console.WriteLine("Scan canceled.");
                        break;

                    case Vintasoft.Twain.AcquireModalState.ScanFailed:
                        // output current state
                        System.Console.WriteLine(string.Format("Scan failed: {0}", device.ErrorString));
                        break;
                }
            }
            while (acquireModalState != Vintasoft.Twain.AcquireModalState.None);

            // close the device
            device.Close();

            // close the device manager
            deviceManager.Close();
        }
    }
    catch (Vintasoft.Twain.TwainException ex)
    {
        System.Console.WriteLine("Error: " + ex.Message);
    }

    System.Console.ReadLine();
}


以下 C# 代码展示了如何在 Linux 系统中从 SANE 图像扫描仪获取图像:
/// <summary>
/// Synchronously acquire images images from SANE scanner.
/// </summary>
public void SynchronouslyAcquireImagesFromSaneScanner()
{
    // create SANE device manager
    using (Vintasoft.Sane.SaneLocalDeviceManager deviceManager = new Vintasoft.Sane.SaneLocalDeviceManager())
    {
        // open SANE device manager
        deviceManager.Open();

        // get count of SANE devices
        int deviceCount = deviceManager.Devices.Count;
        if (deviceCount == 0)
        {
            System.Console.WriteLine("Devices are not found.");
            return;
        }

        // select the first SANE device
        Vintasoft.Sane.SaneLocalDevice device = deviceManager.Devices[0];

        // open SANE device
        device.Open();

        int imageIndex = 0;
        Vintasoft.Sane.SaneAcquiredImage acquiredImage;
        do
        {
            try
            {
                // acquire image from SANE device
                acquiredImage = device.AcquireImageSync();
                // if image is received
                if (acquiredImage != null)
                {
                    imageIndex++;
                    string filename = string.Format("scannedImage-{0}.png", imageIndex);
                    if (System.IO.File.Exists(filename))
                        System.IO.File.Delete(filename);

                    acquiredImage.Save(filename);

                    System.Console.WriteLine(string.Format("Acquired image is saved to a file '{0}'.", filename));
                }
                // if image is not received
                else
                {
                    System.Console.WriteLine("Scan is completed.");
                    break;
                }
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(string.Format("Scan is failed: {0}", ex.Message));
                break;
            }
        }
        // while device has more images to scan
        while (device.HasMoreImagesToScan);

        // close SANE device
        device.Close();

        // close SANE device manager
        deviceManager.Close();
    }

    System.Console.ReadLine();
}