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

    Если вы хотите получить расширенную информацию об изображении, вам следует выполнить следующие шаги:
    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