Сканирование изображений с помощью .NET приложения в Windows и Linux

Категория: TWAIN.NET

8 апреля 2024

TWAIN - это стандартный протокол и интерфейс (API), определяющий взаимодействие между программой и сканером изображений. Стандарт TWAIN разрабатывается рабочей группой TWAIN. Версия 1 TWAIN стандарта определяет взаимодействие с сканерами изображений для Windows. Версия 2 TWAIN стандарта определяет взаимодействие с сканерами изображений для Windows, macOS, Linux.
TWAIN стандарт является самым популярным стандартом для сканеров изображений для Windows. Практически любой сканер изображений имеет TWAIN драйвер для использования сканера изображений в Windows.
TWAIN стандарт не является популярным стандартом в Linux и наше исследование (на начало 2024 года) показало что только компания Kodak предоставляет TWAIN драйвера для использования Kodak сканеров изображений в Linux.

SANE (Scanner Access Now Easy) - это интерфейс прикладного программирования (API), который предоставляет стандартизированный доступ к устройствам сканирования растровых изображений (планшетные сканеры, ручные сканеры, ...). SANE API является общественным достоянием и открыт для всеобщего обсуждения и разработки. SANE API является самым популярным API для сканеров изображений для Linux.
Многие производители сканеров создали SANE драйвера для своих сканеров изображений. Также есть SANE драйвера, которые созданы SANE сообществом. В итоге практически для любого современного сканера изображений есть SANE драйвер, который позволяет использовать сканер изображений в Linux.

VintaSoft Twain .NET SDK - это профессиональная .NET библиотека для сканирования изображений, которая позволяет управлять TWAIN или SANE сканером и получать изображения в .NET приложении для Windows и Linux. Полученные изображения могут быть обработаны и сохранены в файл или загружены на HTTP(S) или FTP сервер.

VintaSoft Twain .NET SDK предоставляет VintaSoft TWAIN .NET API для работы с TWAIN устройством в Windows и Linux. Также VintaSoft Twain .NET SDK предоставляет VintaSoft SANE .NET API для работы с SANE устройством в Linux. Подробную информацию о VintaSoft TWAIN .NET API и VintaSoft SANE .NET API пожалуйста читайте в документации для .NET разработчика: https://www.vintasoft.ru/docs/vstwain-dotnet/

Вот C# код, который показывает как получить изображения от TWAIN сканера изображений в Windows и Linux:
/// <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# код, который показывает как получить изображения от SANE сканера изображений в Linux:
/// <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();
}