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년 초 기준)에 따르면 Kodak만이 Linux에서 자사 이미지 스캐너를 사용할 수 있도록 TWAIN 드라이버를 제공하고 있습니다.

SANE은 래스터 이미지 스캐닝 장치(평판 스캐너, 휴대용 스캐너 등)에 표준화된 방식으로 접근할 수 있도록 하는 애플리케이션 프로그래밍 인터페이스(API)입니다. SANE API는 공개 도메인이며, 누구나 토론하고 개발할 수 있습니다. SANE API는 Linux에서 가장 널리 사용되는 이미지 스캐너 API입니다.
많은 스캐너 제조업체들이 자사 이미지 스캐너용 SANE 드라이버를 개발했습니다. SANE 커뮤니티에서도 SANE 드라이버를 개발했습니다. 결과적으로 거의 모든 최신 이미지 스캐너에는 Linux에서 장치를 사용할 수 있도록 하는 SANE 드라이버가 있습니다.

VintaSoft Twain .NET SDK는 Windows 및 Linux용 .NET 애플리케이션에서 TWAIN 또는 SANE 스캐너를 제어하고 이미지를 획득할 수 있도록 하는 전문 이미지 스캐닝 라이브러리입니다. 획득한 이미지는 전처리 후 파일로 저장하거나 HTTP(S) 또는 FTP 서버에 업로드할 수 있습니다.

VintaSoft Twain .NET SDK는 Windows 및 Linux에서 TWAIN 장치와 상호 작용하기 위한 VintaSoft TWAIN .NET API를 제공합니다. 또한 VintaSoft Twain .NET SDK는 Linux에서 SANE 장치와 상호 작용하기 위한 VintaSoft SANE .NET API를 제공합니다. VintaSoft TWAIN .NET API 및 VintaSoft SANE .NET API에 대한 자세한 정보는 다음 .NET 개발자용 문서를 참조하십시오. https://www.vintasoft.com/docs/vstwain-dotnet/

다음은 Windows 및 Linux에서 TWAIN 이미지 스캐너를 사용하여 이미지를 획득하는 방법을 보여주는 C# 코드입니다.
/// <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();
}


다음은 Linux에서 SANE 이미지 스캐너를 사용하여 이미지를 획득하는 방법을 보여주는 C# 코드입니다.
/// <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();
}