VintaSoft Twain .NET SDK 15.4: Руководство для .NET разработчика
В этом разделе
Как получить расширенную информацию об изображении, полученном от TWAIN сканера изображений?
В этом разделе
позволяет получить расширенную информацию о отсканированном изображении. Расширенная информация о изображении может содержать информацию о номере документа/страницы, кадре изображения, штрихкодах или патч-кодах, найденных на странице, информацию о сглаживании, процессе выравнивания и многое другое.

Если вы хотите получить расширенную информацию об изображении, вам следует выполнить следующие шаги:
  1. Убедитесь, что получение расширенной информации об изображении поддерживается устройством.
  2. Выберите, какую информацию вы хотите получить.
  3. Получите расширенной информации о изображении сразу после получения изображения

Вот C#/VB.NET код, который демонстрирует, как получить расширенную информацию (номер документа, номер страницы, камера, номер кадра, кадр, качество пикселей) о отсканированном изображении:
static bool _isScanningFinished;



/// <summary>
/// Asynchronously acquires images from TWAIN device and retrieves from TWAIN device an extended information about acquired images.
/// </summary>
public static void AsynchronouslyAcquireImageFromTwainDeviceAndGetExtendedInfoAboutAcquiredImages()
{
    _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 the device events
        device.ImageAcquired += new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
        device.ScanFinished += new System.EventHandler(device_ScanFinished);

        // set scanning settings
        device.TransferMode = Vintasoft.Twain.TransferMode.Memory;
        device.ShowUI = false;
        device.DisableAfterAcquire = true;

        // open the device
        device.Open();

        // specify that extended information about acquired image is necessary
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.DocumentNumber));
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.PageNumber));
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.Camera));
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.FrameNumber));
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.Frame));
        device.ExtendedImageInfo.Add(new Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.PixelFlavor));

        // acquire images asynchronously
        device.Acquire();

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

/// <summary>
/// Image is acquired.
/// </summary>
private static void device_ImageAcquired(object sender, Vintasoft.Twain.ImageAcquiredEventArgs e)
{
    // output an extended information about the acquired image

    System.Console.WriteLine("IMAGE IS ACQUIRED");
    System.Console.WriteLine();

    Vintasoft.Twain.Device device = (Vintasoft.Twain.Device)sender;
    for (int i = 0; i < device.ExtendedImageInfo.Count; i++)
    {
        AddExtendedImageInfoToResultTextBox(i, device.ExtendedImageInfo[i]);
    }
    System.Console.WriteLine();

    // dispose the acquired image
    e.Image.Dispose();
}

/// <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
    device.ImageAcquired -= new System.EventHandler<Vintasoft.Twain.ImageAcquiredEventArgs>(device_ImageAcquired);
    device.ScanFinished -= new System.EventHandler(device_ScanFinished);

    // 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>
/// Add an extended image info to the result text box.
/// </summary>
private static void AddExtendedImageInfoToResultTextBox(int index, Vintasoft.Twain.ExtendedImageInfo info)
{
    if (!info.IsValueValid)
        return;

    System.Console.WriteLine(string.Format("Extended image info {0}", index));
    System.Console.WriteLine(string.Format("  Name={0}", System.Enum.GetName(typeof(Vintasoft.Twain.ExtendedImageInfoId), info.InfoId)));
    System.Console.WriteLine(string.Format("  Id={0}", info.InfoId));
    System.Console.WriteLine(string.Format("  Value type={0}", info.ValueType));

    Vintasoft.Twain.TwainOneValueContainer oneDeviceCapabilityValue = info.Value as Vintasoft.Twain.TwainOneValueContainer;
    if (oneDeviceCapabilityValue != null)
    {
        System.Console.WriteLine(string.Format("  Value={0}", oneDeviceCapabilityValue.Value));
    }
    else
    {
        Vintasoft.Twain.TwainArrayValueContainer arrayDeviceCapabilityValue = info.Value as Vintasoft.Twain.TwainArrayValueContainer;
        if (arrayDeviceCapabilityValue != null)
        {
            string values = "  Values: ";
            if (arrayDeviceCapabilityValue.Values.GetType() == typeof(byte[]))
            {
                values += string.Format("byte[{0}]", arrayDeviceCapabilityValue.Values.Length);
            }
            else
            {
                for (int i = 0; i < arrayDeviceCapabilityValue.Values.Length; i++)
                    values += string.Format("{0}, ", arrayDeviceCapabilityValue.Values.GetValue(i));
            }
            System.Console.WriteLine(values);
        }
    }
}
Shared _isScanningFinished As Boolean



''' <summary>
''' Asynchronously acquires images from TWAIN device and retrieves from TWAIN device an extended information about acquired images.
''' </summary>
Public Shared Sub AsynchronouslyAcquireImageFromTwainDeviceAndGetExtendedInfoAboutAcquiredImages()
    _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 the device events
        AddHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
        AddHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)

        ' set scanning settings
        device.TransferMode = Vintasoft.Twain.TransferMode.Memory
        device.ShowUI = False
        device.DisableAfterAcquire = True

        ' open the device
        device.Open()

        ' specify that extended information about acquired image is necessary
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.DocumentNumber))
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.PageNumber))
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.Camera))
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.FrameNumber))
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.Frame))
        device.ExtendedImageInfo.Add(New Vintasoft.Twain.ExtendedImageInfo(Vintasoft.Twain.ExtendedImageInfoId.PixelFlavor))

        ' acquire images asynchronously
        device.Acquire()

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

''' <summary>
''' Image is acquired.
''' </summary>
Private Shared Sub device_ImageAcquired(sender As Object, e As Vintasoft.Twain.ImageAcquiredEventArgs)
    ' output an extended information about the acquired image

    System.Console.WriteLine("IMAGE IS ACQUIRED")
    System.Console.WriteLine()

    Dim device As Vintasoft.Twain.Device = DirectCast(sender, Vintasoft.Twain.Device)
    For i As Integer = 0 To device.ExtendedImageInfo.Count - 1
        AddExtendedImageInfoToResultTextBox(i, device.ExtendedImageInfo(i))
    Next
    System.Console.WriteLine()

    ' dispose the acquired image
    e.Image.Dispose()
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
    RemoveHandler device.ImageAcquired, New System.EventHandler(Of Vintasoft.Twain.ImageAcquiredEventArgs)(AddressOf device_ImageAcquired)
    RemoveHandler device.ScanFinished, New System.EventHandler(AddressOf device_ScanFinished)

    ' 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>
''' Add an extended image info to the result text box.
''' </summary>
Private Shared Sub AddExtendedImageInfoToResultTextBox(index As Integer, info As Vintasoft.Twain.ExtendedImageInfo)
    If Not info.IsValueValid Then
        Return
    End If

    System.Console.WriteLine(String.Format("Extended image info {0}", index))
    System.Console.WriteLine(String.Format("  Name={0}", System.[Enum].GetName(GetType(Vintasoft.Twain.ExtendedImageInfoId), info.InfoId)))
    System.Console.WriteLine(String.Format("  Id={0}", info.InfoId))
    System.Console.WriteLine(String.Format("  Value type={0}", info.ValueType))

    Dim oneDeviceCapabilityValue As Vintasoft.Twain.TwainOneValueContainer = TryCast(info.Value, Vintasoft.Twain.TwainOneValueContainer)
    If oneDeviceCapabilityValue IsNot Nothing Then
        System.Console.WriteLine(String.Format("  Value={0}", oneDeviceCapabilityValue.Value))
    Else
        Dim arrayDeviceCapabilityValue As Vintasoft.Twain.TwainArrayValueContainer = TryCast(info.Value, Vintasoft.Twain.TwainArrayValueContainer)
        If arrayDeviceCapabilityValue IsNot Nothing Then
            Dim values As String = "  Values: "
            If arrayDeviceCapabilityValue.Values.[GetType]() = GetType(Byte()) Then
                values += String.Format("byte[{0}]", arrayDeviceCapabilityValue.Values.Length)
            Else
                For i As Integer = 0 To arrayDeviceCapabilityValue.Values.Length - 1
                    values += String.Format("{0}, ", arrayDeviceCapabilityValue.Values.GetValue(i))
                Next
            End If
            System.Console.WriteLine(values)
        End If
    End If
End Sub


Вот C#/VB.NET код, который демонстрирует, как получить информацию о штрихкодах, распознанных на отсканированном изображении:
/// <summary>
/// Synchronously acquires images from TWAIN device and retrieves from TWAIN device information about barcodes recognized on acquired images.
/// </summary>
public void SynchronouslyAcquireImageFromTwainDeviceAndRecognizeBarcodeInAcquiredImages()
{
    using (Vintasoft.Twain.DeviceManager deviceManager = new Vintasoft.Twain.DeviceManager())
    {
        try
        {
            // open the device manager
            deviceManager.Open();

            deviceManager.ShowDefaultDeviceSelectionDialog();

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

            // specify that device UI must not be used
            device.ShowUI = false;
            // specify that device must be closed after scan
            device.DisableAfterAcquire = true;

            // open the device
            device.Open();

            // specify that device should recognize barcodes in acquired images
            device.BarcodeRecognizer.IsEnabled = true;

            // acquire images from device
            Vintasoft.Twain.AcquireModalState acquireModalState = Vintasoft.Twain.AcquireModalState.None;
            do
            {
                acquireModalState = device.AcquireModal();

                switch (acquireModalState)
                {
                    case Vintasoft.Twain.AcquireModalState.ImageAcquired:
                        // get information about recognized barcodes
                        Vintasoft.Twain.TwainBarcodeInfo[] recognizedBarcodes = device.BarcodeRecognizer.GetRecognitionResult();
                        // if barcodes are NOT found
                        if (recognizedBarcodes.Length == 0)
                        {
                            System.Console.WriteLine("Barcodes are NOT found.");
                        }
                        // if barcodes are found
                        else
                        {
                            System.Console.WriteLine(string.Format("{0} barcodes are found.", recognizedBarcodes.Length));
                            // for each recognized barcode
                            for (int i = 0; i < recognizedBarcodes.Length; i++)
                            {
                                // output barcode type
                                System.Console.Write(string.Format("BarcodeType={0} ", recognizedBarcodes[i].Type));
                                // output barcode text
                                System.Console.WriteLine(string.Format("BarcodeText='{0}'", recognizedBarcodes[i].Value));
                            }
                        }

                        // if acquired image is present (Native or Memory transfer mode is used)
                        if (device.AcquiredImage != null)
                            // dispose the acquired image
                            device.AcquiredImage.Dispose();

                        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();
        }
    }
}
''' <summary>
''' Synchronously acquires images from TWAIN device and retrieves from TWAIN device information about barcodes recognized on acquired images.
''' </summary>
Public Sub SynchronouslyAcquireImageFromTwainDeviceAndRecognizeBarcodeInAcquiredImages()
    Using deviceManager As New Vintasoft.Twain.DeviceManager()
        Try
            ' open the device manager
            deviceManager.Open()

            deviceManager.ShowDefaultDeviceSelectionDialog()

            ' get reference to the default device
            Dim device As Vintasoft.Twain.Device = deviceManager.DefaultDevice

            ' specify that device UI must not be used
            device.ShowUI = False
            ' specify that device must be closed after scan
            device.DisableAfterAcquire = True

            ' open the device
            device.Open()

            ' specify that device should recognize barcodes in acquired images
            device.BarcodeRecognizer.IsEnabled = True

            ' acquire images from device
            Dim acquireModalState As Vintasoft.Twain.AcquireModalState = Vintasoft.Twain.AcquireModalState.None
            Do
                acquireModalState = device.AcquireModal()

                Select Case acquireModalState
                    Case Vintasoft.Twain.AcquireModalState.ImageAcquired
                        ' get information about recognized barcodes
                        Dim recognizedBarcodes As Vintasoft.Twain.TwainBarcodeInfo() = device.BarcodeRecognizer.GetRecognitionResult()
                        ' if barcodes are NOT found
                        If recognizedBarcodes.Length = 0 Then
                            System.Console.WriteLine("Barcodes are NOT found.")
                        Else
                            ' if barcodes are found
                            System.Console.WriteLine(String.Format("{0} barcodes are found.", recognizedBarcodes.Length))
                            ' for each recognized barcode
                            For i As Integer = 0 To recognizedBarcodes.Length - 1
                                ' output barcode type
                                System.Console.Write(String.Format("BarcodeType={0} ", recognizedBarcodes(i).Type))
                                ' output barcode text
                                System.Console.WriteLine(String.Format("BarcodeText='{0}'", recognizedBarcodes(i).Value))
                            Next
                        End If

                        ' if acquired image is present (Native or Memory transfer mode is used)
                        If device.AcquiredImage IsNot Nothing Then
                            ' dispose the acquired image
                            device.AcquiredImage.Dispose()
                        End If

                        Exit Select
                End Select
            Loop While acquireModalState <> Vintasoft.Twain.AcquireModalState.None

            ' close the device
            device.Close()

            ' close the device manager
            deviceManager.Close()
        Catch ex As Vintasoft.Twain.TwainException
            System.Console.WriteLine("Error: " + ex.Message)
            System.Console.ReadLine()
        End Try
    End Using
End Sub