VintaSoft Twain .NET SDK 15.4: Documentation for .NET developer
In This Topic
Acquire images from TWAIN image scanner directly to disk
In This Topic
A lot of TWAIN devices support the File transfer mode and allow to save acquired images directly to a file on disk.
Transfer modes, which are supported by TWAIN device, can be retrieved using Device.GetSupportedTransferModes method.

All TWAIN devices can save acquired images as BMP files. Professional TWAIN devices can save acquired images as TIFF, JPEG, PDF, etc files.
File formats, which are supported by TWAIN device, can be retrieved using Device.GetSupportedImageFileFormats method.
File format compressions, which are supported by TWAIN device, can be retrieved using Device.GetSupportedImageCompressions method.


Here is an example that demonstrates how to to specify that TWAIN device should save acquired images directly to a disk as JPEG files with 70% JPEG image quality:
static bool _isScanningFinished;

/// <summary>
/// Index of acquired image.
/// </summary>
static int _imageIndex;


/// <summary>
/// Uses File tranfer for saving TWAIN acquired images directly to a file on disk.
/// </summary>
public static void UseFileTransferForAcquiringImagesFromTwainDevice()
{
    _isScanningFinished = false;

    // create the device manager
    using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
    {
        deviceManager.IsTwain2Compatible = true;
        // open the device manager
        deviceManager.Open();

        // get the device
        Vintasoft.Twain.Device device = deviceManager.DefaultDevice;
        if (device == null)
            return;

        // subscribe to device events
        SubscribeToDeviceEvents(device);

        // disable device UI
        device.ShowUI = false;
        // set the File transfer mode
        device.TransferMode = Vintasoft.Twain.TransferMode.File;

        // open the device
        device.Open();

        // specify that grayscale images must be acquired
        device.PixelType = Vintasoft.Twain.PixelType.Gray;
        // set the inches as unit of measure
        device.UnitOfMeasure = Vintasoft.Twain.UnitOfMeasure.Inches;
        device.Resolution = new Vintasoft.Twain.Resolution(300f, 300f);

        // run asynchronous image acqusition
        device.Acquire();

        // wait while feeder will be stopped
        while (!_isScanningFinished)
        {
            System.Windows.Forms.Application.DoEvents();
        }

        // unsubscribe from device events
        UnsubscribeFromDeviceEvents(device);

        // close the device
        device.Close();
    }
}

/// <summary>
/// Image is acquiring.
/// </summary>
private static void Device_ImageAcquiring(object sender, Vintasoft.Twain.ImageAcquiringEventArgs e)
{
    string fileExtension = "bmp";
    switch (e.FileFormat)
    {
        case Vintasoft.Twain.TwainImageFileFormat.Tiff:
            fileExtension = "tif";
            break;

        case Vintasoft.Twain.TwainImageFileFormat.Jpeg:
            fileExtension = "jpg";
            break;
    }

    e.Filename = System.IO.Path.Combine(@"d:\images\", string.Format("page{0}.{1}", _imageIndex, fileExtension));
}

/// <summary>
/// Image is acquired.
/// </summary>
private static void device_ImageAcquired(object sender, Vintasoft.Twain.ImageAcquiredEventArgs e)
{
    System.Console.WriteLine(string.Format("Image is saved to a file '{0}'.", System.IO.Path.GetFileName(e.Filename)));
    _imageIndex++;
}

/// <summary>
/// Scan is completed.
/// </summary>
private static void device_ScanCompleted(object sender, System.EventArgs e)
{
    System.Console.WriteLine("Scan is completed.");
}

/// <summary>
/// Scan is canceled.
/// </summary>
private static void device_ScanCanceled(object sender, System.EventArgs e)
{
    System.Console.WriteLine("Scan is canceled.");
}

/// <summary>
/// Scan is failed.
/// </summary>
private static void device_ScanFailed(object sender, Vintasoft.Twain.ScanFailedEventArgs e)
{
    System.Console.WriteLine(string.Format("Scan is failed: {0}.", e.ErrorString));
}

/// <summary>
/// Scan is finished.
/// </summary>
private static void device_ScanFinished(object sender, System.EventArgs e)
{
    Vintasoft.Twain.Device device = (Vintasoft.Twain.Device)sender;

    // unsubscribe from device events
    UnsubscribeFromDeviceEvents(device);

    // if device is not closed
    if (device.State != Vintasoft.Twain.DeviceState.Closed)
        // close the device
        device.Close();

    System.Console.WriteLine("Scan is finished.");

    _isScanningFinished = true;
}

/// <summary>
/// Subscribes to the device events.
/// </summary>
private static void SubscribeToDeviceEvents(Vintasoft.Twain.Device device)
{
    device.ImageAcquiring += new System.EventHandler<Vintasoft.Twain.ImageAcquiringEventArgs>(Device_ImageAcquiring);
    device.ImageAcquired += new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
    device.ScanCompleted += new System.EventHandler(device_ScanCompleted);
    device.ScanCanceled += new System.EventHandler(device_ScanCanceled);
    device.ScanFailed += new System.EventHandler<Vintasoft.Twain.ScanFailedEventArgs>(device_ScanFailed);
    device.ScanFinished += new System.EventHandler(device_ScanFinished);
}

/// <summary>
/// Unsubscribes from the device events.
/// </summary>
private static void UnsubscribeFromDeviceEvents(Vintasoft.Twain.Device device)
{
    device.ImageAcquiring -= new System.EventHandler<Vintasoft.Twain.ImageAcquiringEventArgs>(Device_ImageAcquiring);
    device.ImageAcquired -= new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
    device.ScanCompleted -= new System.EventHandler(device_ScanCompleted);
    device.ScanCanceled -= new System.EventHandler(device_ScanCanceled);
    device.ScanFailed -= new System.EventHandler<Vintasoft.Twain.ScanFailedEventArgs>(device_ScanFailed);
    device.ScanFinished -= new System.EventHandler(device_ScanFinished);
}
Shared _isScanningFinished As Boolean

''' <summary>
''' Index of acquired image.
''' </summary>
Shared _imageIndex As Integer


''' <summary>
''' Uses File tranfer for saving TWAIN acquired images directly to a file on disk.
''' </summary>
Public Shared Sub UseFileTransferForAcquiringImagesFromTwainDevice()
    _isScanningFinished = False

    ' create the device manager
    Using deviceManager As New Vintasoft.Twain.DeviceManager()
        deviceManager.IsTwain2Compatible = True
        ' open the device manager
        deviceManager.Open()

        ' get the device
        Dim device As Vintasoft.Twain.Device = deviceManager.DefaultDevice
        If device Is Nothing Then
            Return
        End If

        ' subscribe to device events
        SubscribeToDeviceEvents(device)

        ' disable device UI
        device.ShowUI = False
        ' set the File transfer mode
        device.TransferMode = Vintasoft.Twain.TransferMode.File

        ' open the device
        device.Open()

        ' specify that grayscale images must be acquired
        device.PixelType = Vintasoft.Twain.PixelType.Gray
        ' set the inches as unit of measure
        device.UnitOfMeasure = Vintasoft.Twain.UnitOfMeasure.Inches
        device.Resolution = New Vintasoft.Twain.Resolution(300.0F, 300.0F)

        ' run asynchronous image acqusition
        device.Acquire()

        ' wait while feeder will be stopped
        While Not _isScanningFinished
            System.Windows.Forms.Application.DoEvents()
        End While

        ' unsubscribe from device events
        UnsubscribeFromDeviceEvents(device)

        ' close the device
        device.Close()
    End Using
End Sub

''' <summary>
''' Image is acquiring.
''' </summary>
Private Shared Sub Device_ImageAcquiring(sender As Object, e As Vintasoft.Twain.ImageAcquiringEventArgs)
    Dim fileExtension As String = "bmp"
    Select Case e.FileFormat
        Case Vintasoft.Twain.TwainImageFileFormat.Tiff
            fileExtension = "tif"
            Exit Select

        Case Vintasoft.Twain.TwainImageFileFormat.Jpeg
            fileExtension = "jpg"
            Exit Select
    End Select

    e.Filename = System.IO.Path.Combine("d:\images\", String.Format("page{0}.{1}", _imageIndex, fileExtension))
End Sub

''' <summary>
''' Image is acquired.
''' </summary>
Private Shared Sub device_ImageAcquired(sender As Object, e As Vintasoft.Twain.ImageAcquiredEventArgs)
    System.Console.WriteLine(String.Format("Image is saved to a file '{0}'.", System.IO.Path.GetFileName(e.Filename)))
    _imageIndex += 1
End Sub

''' <summary>
''' Scan is completed.
''' </summary>
Private Shared Sub device_ScanCompleted(sender As Object, e As System.EventArgs)
    System.Console.WriteLine("Scan is completed.")
End Sub

''' <summary>
''' Scan is canceled.
''' </summary>
Private Shared Sub device_ScanCanceled(sender As Object, e As System.EventArgs)
    System.Console.WriteLine("Scan is canceled.")
End Sub

''' <summary>
''' Scan is failed.
''' </summary>
Private Shared Sub device_ScanFailed(sender As Object, e As Vintasoft.Twain.ScanFailedEventArgs)
    System.Console.WriteLine(String.Format("Scan is failed: {0}.", e.ErrorString))
End Sub

''' <summary>
''' Scan is finished.
''' </summary>
Private Shared Sub device_ScanFinished(sender As Object, e As System.EventArgs)
    Dim device As Vintasoft.Twain.Device = DirectCast(sender, Vintasoft.Twain.Device)

    ' unsubscribe from device events
    UnsubscribeFromDeviceEvents(device)

    ' if device is not closed
    If device.State <> Vintasoft.Twain.DeviceState.Closed Then
        ' close the device
        device.Close()
    End If

    System.Console.WriteLine("Scan is finished.")

    _isScanningFinished = True
End Sub

''' <summary>
''' Subscribes to the device events.
''' </summary>
Private Shared Sub SubscribeToDeviceEvents(device As Vintasoft.Twain.Device)
    AddHandler device.ImageAcquiring, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiringEventArgs)(AddressOf Device_ImageAcquiring)
    AddHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
    AddHandler device.ScanCompleted, New System.EventHandler(AddressOf device_ScanCompleted)
    AddHandler device.ScanCanceled, New System.EventHandler(AddressOf device_ScanCanceled)
    AddHandler device.ScanFailed, New System.EventHandler(Of Vintasoft.Twain.ScanFailedEventArgs)(AddressOf device_ScanFailed)
    AddHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)
End Sub

''' <summary>
''' Unsubscribes from the device events.
''' </summary>
Private Shared Sub UnsubscribeFromDeviceEvents(device As Vintasoft.Twain.Device)
    RemoveHandler device.ImageAcquiring, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiringEventArgs)(AddressOf Device_ImageAcquiring)
    RemoveHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
    RemoveHandler device.ScanCompleted, New System.EventHandler(AddressOf device_ScanCompleted)
    RemoveHandler device.ScanCanceled, New System.EventHandler(AddressOf device_ScanCanceled)
    RemoveHandler device.ScanFailed, New System.EventHandler(Of Vintasoft.Twain.ScanFailedEventArgs)(AddressOf device_ScanFailed)
    RemoveHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)
End Sub