VintaSoftTwain ActiveX Control - Часто задаваемые вопросы

Общие вопросы:

 

Распространение:

 

Установка:

 

Веб установка:

 

Программирование:

 

Базы данных:

 

 

Для каких целей могу я использовать VintaSoftTwain ActiveX компонент?

Данный ActiveX компонент может использоваться для управления работой сканеров, цифровых и веб камер и любых других устройств, которые поддерживают TWAIN стандарт.

 


 

В каких языках программирования могу я использовать это ActiveX компонент?

Лицензия разработчика и лицензия для компании позволяют использовать компонент в:

  • MS Visual Studio 6.0 (VB, VC++, VFoxpro)
  • Borland Delphi, Borland C++ Builder
  • MS .NET Studio (VB.NET, C#.NET, C++.NET)
  • MS Office (Excel, Word, Access)
  • любых языках программирования и приложениях, поддерживающих работу с ActiveX компонентами.

Лицензия для сервера позволяет использовать компонент в:

  • Internet Explorer 5.0 и выше : ASP.NET, PHP, JavaScript, VBScript, etc
  • Mozilla Firefox 3.0 и выше с IE Tab Plug-in : ASP.NET, PHP, JavaScript, VBScript, etc
  • любых других языках основывающихся на HTML.

 

 

Какие ограничения имеет незарегистрированная версия компонента?

Ограничения незарегистрированной версии:

  • будет показано окно "О программе" при каждом сканировании изображений
  • любое изображение может быть сохранено на диск или загружено на сервер как BMP файл
  • только черно-белое или серое изображение может быть сохранено на диск или загружено на сервер как JPEG или TIFF файл

Все эти ограничения удалены в зарегистрированной версии компонента.

 

 

Я не нашел ответа на свой вопрос. Что мне делать?

Информация по большинству вопросов может быть найдена в документации к компоненту или в этом FAQ. Если Вы не нашли ответа на свой вопрос, тогда напишите письмо в службу технической поддержки.

 


 

Могу я распространять этот ActiveX компонент вместе с моим приложением?

Да, Вы можете распространять компонент вместе со своим приложением. Вы платите только за первоначальную регистрацию.
Лицензия для компании не имеет ограничений в распространении. Лицензия для разработчика имеет некоторые ограничения в распространении. Распространение с Лицензией для сервера требует оплаты для каждого сервера. Пожалуйста, читайте лицензионное соглашение.

 


 

Какие файлы мне нужно включать в дистрибутив моей программы?

Вам нужно включить в дистрибутив Вашей программы только один файл: vstwain.dll.
После установки Вашей программы на компьютер, пожалуйста зарегистрируйте ActiveX компонент с помощью программы regsvr32.exe (regsvr32.exe vstwain.dll).

 


 

Я создал программу в Visual Studio .NET. Какие шаги должен я выполнить для корректной установки моей программы на компьютере клиента?

Перед распространением Вашей программы:

  • Удалите из Вашего проекта ссылки на файлы AxVSTWAINLib и VSTWAINLib, и добавьте их заново - файлы AxVSTWAINLib и VSTWAINLib должны быть расположены в директории вместе с Вашей программой.
  • Убедитесь что свойство "Copy Local" для ссылок на файлы AxVSTWAINLib и VSTWAINLib имеет значение "False".
  • После компилляции Вашей программы добавьте три файла в дистрибутив Вашей программы: vstwain.dll, AxInterop.VSTWAINLib.dll, Interop.VSTWAINLib.dll (два последних файла будут сгенерированы Visual Studio).

Во время распространения Вашей программы:

  • Убедитесь что .NET Framework установлена на компьютере. Если на компьютере не установлена платформа .NET то запустите установку dotnetfx.exe. Информация о использовании ActiveX в среде .NET: "Using ActiveX Controls with Windows Forms in Visual Studio .NET Upgrading to Microsoft .NET" and about redistribution: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/vsredistdeploy.asp
  • Зарегистрируйте ActiveX на компьютере с помощью команды: regsvr32.exe vstwain.dll.

 

 

При регистрации ActiveX в Windows 98 я получаю сообщение об ошибке. Что мне делать?

Эта проблема связана с отсутствием необходимых библиотек в системе. Для работы ActiveX необходимы следующие библиотеки:

  • KERNEL32.DLL
  • ATL.DLL
  • GDI32.DLL
  • OLE32.DLL
  • OLEAUT32.DLL
  • SHELL32.DLL
  • USER32.DLL
  • WS2_32.DLL

Пожалуйста установите пакет "Visual C++ run time files" на компьютер - это должно решить проблему. http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe

 

 

Я создал программу в Delphi. Программа работает корректно, если она запущена с правами администратора, но если запустить программу с правами Гостя, то возникает следующее сообщение "Exception EOleSysError in module...". Как решить эту проблему?

Прежде всего необходимо зарегистрировать ActiveX в системе с помощью программы register32.exe - эта операция должна быть выполнена с администраторскими полномочиями.

Далее необходимо использовать следующий код в Вашей программе:

program Simple;

uses
  Forms,
  Windows, Registry, Dialogs,  ActiveX,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

function IsVSTwainRegistered : Boolean;
var Reg:TRegistry;
begin
 Reg:=TRegistry.Create;
 try
  Reg.RootKey:=HKEY_CLASSES_ROOT;
  Result:=Reg.OpenKey('CLSID\{1169E0CD-9E76-11D7-B1D8-FB63945DE96D}',False);
  if Result then Reg.CloseKey;
 finally
  Reg.Free;
 end;
end;

begin
  if not IsVSTwainRegistered() then
    begin
      ShowMessage('VintaSoftTwain ActiveX is not registered!');
      Exit;
    end;
    
  OleInitialize(nil);
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  OleUninitialize;
end.

Этот код позволяет проверить зарегистрирована ли программа в системе и позволяет запустить Вашу программу с минимальными правами.

 

 

Как мне добавить объект VintaSoftTwain на форму в проекте VB.NET?

Необходимо выполнить следующие шаги для добавления объекта VintaSoftTain на форму приложения:
  • Запустить Visual Studio.NET и открыть приложение
  • Открыть в дизайнере форм форму приложения на которой необходимо разместить объект VintaSoftTwain
  • Открыть панель компонентов (Toolbox pane)
  • Нажать правую кнопку мыши на панели компонентов
  • Выбрать пункт "Add/Remove Items..." из появившего меню
  • Открыть закладку "COM Components"
  • Нажать кнопку "Browse..." и выбрать файл VSTwain.dll
  • Найти и выделить класс VintaSoftTwain в списке
  • Закрыть окно нажав кнопку "OK"
  • Найти и выбрать объект VintaSoftTwain в панели компонентов
  • Переместить с помощью мыши объект VintaSoftTwain на форму приожения

 

 

Я хочу использовать ActiveX в Delphi 2005, но дизайнер форм не позволяет добавлять ActiveX компоненты на форму приложения. Возникает следующая ошибка "Failed to add a reference to the ActiveX type library. Ensure that it is properly registered. ...". Как решить эту проблему?

Borland Delphi 8.0 (2005) и Borland C# Builder 1.0 принимают ActiveX компоненты только если выбрана установка US locale. Другие установки игнорируются.

Вот список шагов позволяющих решить данную проблему:

  • Удалить ActiveX из панели компонентов (Tools Palette)
  • Сменить вариант языка установленный в компьютере на "US Locale"
  • Перезагрузить компьютер
  • Заново добавить ActiveX в панель компонентов - все должно заработать.

 

 

Как мне динамически добавить VintaSoftTwain объект в мой проект на VB?

Необходимо сделать следующее:
  • Открыть пункт меню "Project -> References".
  • В открывшемся окне добавить ссылку на объект "VintaSoftTwain ActiveX Control".
  • Далее нужно добавить следующий код к проекту:
  Option Explicit
  Dim WithEvents VSTwain1 As VSTWAINLib.VintaSoftTwain

  Private Sub StartScan_Click()
     Set VSTwain1 = New VSTWAINLib.VintaSoftTwain
     With VSTwain1
        .StartDevice
        If .SelectSource = 1 Then
            .ShowUI = True
            .Acquire
        End If
     End With
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
     If Flag <> 0 Then
        If VSTwain1.ErrorCode <> 0 Then
            MsgBox VSTwain1.ErrorString
        End If
     Else
        Set Image1.Picture = VSTwain1.GetCurrentImage
        VSTwain1.TiffCompression = 10
        VSTwain1.SaveImage 0, "c:\test.tif"
     End If
  End Sub

 

 

Я пытаюсь использовать ActiveX в среде Windows 2003 Server, но возникает ошибка "Error at loading the TWAIN_32.DLL". Как решить эту проблему?

Версия Windows 2003 Server которую Вы используете имеет ошибку в конфигурации: Функция GetWindowsDirectory возвращает некорректный путь к директории Windows, а именно "C:\Documents and Settings\User\Windows\" вместо "C:\Windows\". Данная статья поможет Вам решить проблему: http://support.microsoft.com/kb/832048.

 


 

Мне не удается добавить объект VintaSoftTwain на форму приложения в среде VS .NET 2005. Как решить эту проблему?

Вы должны добавить к своему проекту ссылку на библиотеку "stdole" перед добавлением объекта VintaSoftTwain на форму приложения. Вот список необходимых шагов:

  • Наведите курсор мыши на пункт "References" и нажмите правую кнопку
  • Выберите пункт "Add reference" из появившего меню
  • Откройте закладку "COM"
  • Найдите и выберите класс "OLE Automation" из списка
  • Закройте окно нажав кнопку "OK"

После этих шагов Вы можете добавить объект VintaSoftTwain на форму Вашего приложения без каких либо проблем.

 

 

При попытке перетащить ActiveX из Toolbox на форму в MS Visual Studio 2005, возникает ошибка: "Error message: Failed to import the ActiveX control". Есть ли возможность решить эту проблему?

  • Потащите ActiveX из Toolbox на форму, возникает ошибка: "Failed to import the ActiveX control. Please ensure it is properly registered."
  • Выберите в меню: "Build > Rebuild Solution".
  • Потащите ActiveX из Toolbox на форму во второй раз, опять возникает ошибка: "Failed to import the ActiveX control. Please ensure it is properly registered."
  • Выберите в меню во второй раз: "Build > Rebuild Solution".
  • Потащите ActiveX из Toolbox на форму в третий раз и он будет успешно импортирован.

 

 

Как мне подписать мою копию компонента, чтобы использовать его на моей веб странице?

VintaSoftTwain ActiveX подписан цифровым сертификатом от Thawte.
Пожалуста сообщите нам, если Вы хотите подписать VintaSoftTwain ActiveX своим собственным сертификатом.

 


 

Какие шаги мне нужно выполнить чтобы добавить ActiveX к моему интернет проекту?

Вам необходимо выполнить следующие шаги:

  • Добавить файл vstwain.dll на сервер.
  • В HTML коде исправить следующие строки.
  // In example:
  <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
          CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
          CODEBASE="">
  </OBJECT>

  // In your code:
  <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
          CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
          CODEBASE="http://www.your-server.com/activex/VSTwain.cab#version=5,1,0,1">
  </OBJECT>

После всех этих шагов Вам не придется устанавливать ActiveX компонент на всех компьютерах Вашей организации. Когда пользователь откроет страницу с компонентом ему будет выдан запрос на установку компонента на его компьютер. Если он согласится на установку, то компонент будет автоматически установлен на его компьютер и он сможет работать с Вашей веб страницей.

Файл VSTwain.cab находится в директории "Bin" дистрибутивного пакета ActiveX компонента.

 

 

Как могу я загрузить изображение полученное со сканера на веб сервер?

Протокол HTTP не позволяет напрямую загружать изображения на Веб (HTTP) сервер. Для решения этой проблемы можно использовать специальный веб-скрипт, который должен быть помещен на сервер. Вы можете найти множество скриптов в интернете или использовать один из следующих: ASP script, Perl script.

Для загрузки изображений на сервер через скрипт необходимо знать какие поля содержит скрипт.

ASP скрипт содержит следующие поля:

  • Текстовое поле "Demo"
  • Поле для файла "txtFile"
  • Кнопку "cmdSubmit"

и для загрузки изображений через этот скрипт необходимо использовать следующий код:

  if VSTwain1.SetHttpServerParams("http://www.your-server.com/clsUploadTest.asp",
                 "http://www.your-server.com/clsUploadTest.asp", 4) = 0 then
    MsgBox VSTwain1.ErrorString
  else
    VSTwain1.SetHttpFormField "Demo", "Demo string"
    VSTwain1.SetHttpFormField "cmdSubmit", "SUBMIT"
    if VSTwain1.SaveImageToHttp(0, "txtFile", "demo.jpg") = 0 then
        MsgBox VSTwain1.ErrorString
    else
        Timer.Interval = 10
    end if
  end if

Perl скрипт содержит следующие поля:

  • Текстовое поле "login"
  • Текстовое поле "pass"
  • Поле для файла "file"

и для загрузки изображений через этот скрипт необходимо использовать следующий код:

  if VSTwain1.SetHttpServerParams("http://www.your-server.com/cgimages/upload.cgi",
                 "http://www.your-server.com/upload.html", 4) = 0 then
    MsgBox VSTwain1.ErrorString
  else
    VSTwain1.SetHttpFormField "login", "guest"
    VSTwain1.SetHttpFormField "pass", "guest"
    if VSTwain1.SaveImageToHttp(0, "file", "demo.jpg") = 0 then
        MsgBox VSTwain1.ErrorString
    else
        Timer.Interval = 10
    end if
  end if

Также смотрите примеры использования.

 

 

Я пытаюсь выбрать устройство с помощью свойства SourceIndex в Internet Explorer, но получаю ошибку. Почему?

Каждый объект на веб странице в Internet Explorer имеет предопределенное свойство SourceIndex - это свойство доступно только для чтения. Вы должны использовать следующий код чтобы работать с свойством SourceIndex объекта VSTwain в JavaScript или VBScript:
  VSTwain1.StartDevice()
  VSTwain1.object.SourceIndex = 1     ' second device
  VSTwain1.Acquire()

 

 

Могу я использовать ActiveX в Mozilla Firefox?

Да, Вы можете использовать ActiveX в Mozilla Firefox 3.0 и выше с задействованным IE Tab Plug-in.

 


 

Как мне получить черно-белые изображения (документы)?

Вот пример кода для получения черно-белых изображений:
  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then
          VSTwain1.OpenDataSource()
          VSTwain1.PixelType = 0     ' 0 - BW images, 1 - gray images , 2 - RGB images
          VSTwain1.Acquire()
      End If
  End Sub

 

 

Язык программирования который я использую не поддерживает работу с массивами. Как мне обойти эту проблему?

Если Вам необходимо получить массив значений с помощью методов GetPageSizes, GetPixelTypes, GetResolutions, GetUnitsOfMeasure, но используемый Вами язык программирования не поддерживает работу с массивами, тогда Вы можете использовать следующий метод:
  ' This example shows how to get supported pixel types
  VSTwain1.StartDevice()
  VSTwain1.OpenDataSource()
  bSupportBW = 0
  VSTwain1.PixelType = 0                ' black-white (1 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' black-white images is supported by device
    bSupportBW = 1
  end if
  bSupportGray = 0
  VSTwain1.PixelType = 1                ' gray (8 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' gray images is supported by device
    bSupportGray = 1
  end if
  bSupportRGB = 0
  VSTwain1.PixelType = 2                ' RGB (24 bit per pixel)
  if VSTwain1.ErrorCode = 0 then        ' RGB images is supported by device
    bSupportRGB = 1
  end if
  ...................

 

 

Могу я управлять лотком автоматической подачи документов без пользовательского интерфейса?

Вот пример показывающий как можно управлять работой сканера с лотком автоматической подачи документов без пользовательского интерфейса:
  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then             ' user selected the device
          VSTwain1.ShowUI = False                     ' disable UI
          VSTwain1.DisableAfterAcquire = True
          VSTwain1.MaxImages = 1
          VSTwain1.AutoCleanBuffer = True
          VSTwain1.TiffMultiPage = True               ' multi page TIFF file
          VSTwain1.TiffCompression = 10               ' auto detect of best compression algorithm
          If VSTwain1.OpenDataSource() = 1 Then
              VSTwain1.UnitOfMeasure = 0              ' inches
              VSTwain1.PixelType = 0                  ' black-white image
              VSTwain1.Resolution = 200               ' 200 dpi
              If VSTwain1.FeederPresent = 1 Then
                  VSTwain1.FeederEnabled = True
                  If VSTwain1.Duplex <> 0 Then
                      VSTwain1.DuplexEnabled = True   ' enable duplex
                  End If
                  If VSTwain1.FeederLoaded = 1 Then
                      VSTwain1.XferCount = -1
                      VSTwain1.AutoFeed = True
                      VSTwain1.Acquire()
                  End If
              End If
          End If
      End If
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
      If Flag <> 0 Then
          If VSTwain1.ErrorCode <> 0 Then
              MsgBox VSTwain1.ErrorString
          Else
              MsgBox "Scan completed."
          End If
      Else
          If VSTwain1.SaveImage(VSTwain1.NumImages-1,"c:\test.tiff") = 0 Then
            MsgBox VSTwain1.ErrorString
          End If
      End If
  End Sub

 

 

Можно ли создать консольное приложение используя этот ActiveX компонент?

Используя этот ActiveX компонент нельзя создать консольное приложение. Приложение должно иметь собственное окно для работы с компонентом.

 


 

Могу я выбрать нужное мне устройство без стандартного диалога выбора устройства?

Да. Можно использовать следующий код для нумерации устройств:
  VSTwain1.StartDevice
  For i = 0 To VSTwain1.SourcesCount - 1
     MsgBox VSTwain1.GetSourceProductName(i)
  Next
А этот код для выбора первого устройства:
  VSTwain1.StartDevice
  VSTwain1.SourceIndex = 0
  .....
  VSTwain1.Acquire
Хотя самый лучший вариант следующий:
  VSTwain1.StartDevice
  For i = 0 To VSTwain1.SourcesCount - 1
     If VSTwain1.GetSourceProductName(i) = "Your device name" Then
       VSTwain1.SourceIndex = i
       Exit For
    End If
  Next
  .....
В этом случае необходимо знать правильное название устройства.

 

 

Как мне отключить окно индикатора процесса сканирования при получении изображений без пользовательского интерфейса?

Стандарт TWAIN позволяет отключать окно индикатора процесса сканирования, если пользовательский интерфейс не используется (showUI=False). Это можно сделать следующим образом:
  VSTwain1.StartDevice
  VSTwain1.ShowUI = False
  VSTwain1.DisableAfterAcquire = True
  VSTwain1.MaxImages = 1
  VSTwain1.OpenDataSource
  VSTwain1.ShowIndicators = 0     ' disable indicator window
  VSTwain1.Acquire

 

 

Мне нужно отсканировать только часть изображения. Как это сделать?

Используйте следующий код чтобы получить часть изображения ограниченную прямоугольником (0.2,0.2) - (8.3,10.8)
  VSTwain1.StartDevice()
  VSTwain1.ShowUI = False
  VSTwain1.OpenDataSource()
  .............
  VSTwain1.UnitOfMeasure = 0                 ' inches
  VSTwain1.SetImageLayout(0.2,0.2,8.3,10.8)
  VSTwain1.Acquire()

 

 

Как мне установить разное разрешение для оси X и Y во время сканирования изображений?

Вот пример в котором разрешение по оси X устанавливается равным 4800 dpi, а по оси Y равным 9600 dpi:
  VSTwain1.StartDevice
  VSTwain1.ShowUI = False
  VSTwain1.DisableAfterAcquire = True
  VSTwain1.MaxImages = 1
  VSTwain1.OpenDataSource
  VSTwain1.UnitOfMeasure = 0     ' inches
  VSTwain1.Capability = 4376     ' ICAP_XRESOLUTION (0x1118)
  VSTwain1.CapType = 1           ' one value
  VSTwain1.CapValue = 4800       ' 4800 dpi
  VSTwain1.SetCap
  VSTwain1.Capability = 4377     ' ICAP_YRESOLUTION (0x1119)
  VSTwain1.CapType = 1           ' one value
  VSTwain1.CapValue = 9600       ' 9600 dpi
  VSTwain1.SetCap
  VSTwain1.Acquire

 

 

Как мне выбрать ориентацию изображения при сканировании?

Вы можете выбрать ориентацию изображения при сканировании только если сканер поддерживает данную возможность:
  .....
  VSTwain1.OpenDataSource
  VSTwain1.capability = 4368     ' ICAP_ORIENTATION (0x1110)
  If VSTwain1.IsCapSupported Then
    VSTwain1.capType = 1         ' one value
    VSTwain1.capValue = 3        ' Landscape
    VSTwain1.SetCap
  End If
  .....

Возможные значения для ориентации:

  • 0   Книжная ориентация, поворот на 0 градусов
  • 1   Поворот на 90 градусов
  • 2   Поворот на 180 градусов
  • 3   Альбомная ориентация, поворот на 270 градусов

 

 

Наша организация испрользует сетевой сканер с автоматической подачей листов (ADF) и мы обрабатываем множество документов каждый день. Как мы можем автоматизировать нашу работу? Хотелось бы сохранять каждый документ в отдельном файле.

Вы можете использовать пустую страницу как разделитель документов и определять пустые страницы с помощью метода IsBlankPage. Вот пример:
  Dim documentsCounter as Integer

  ............
  documentsCounter = 0
  ............

  Private Sub StartScan()
      VSTwain1.StartDevice()
      If VSTwain1.SelectSource() = 1 Then         ' select the device
          VSTwain1.ShowUI = False                 ' disable UI
          VSTwain1.DisableAfterAcquire = True
          VSTwain1.MaxImages = 1
          VSTwain1.AutoCleanBuffer = True
          VSTwain1.TiffMultiPage = True           ' multi page TIFF file
          VSTwain1.TiffCompression = 10           ' auto detect of best compression algorithm
          If VSTwain1.OpenDataSource() = 1 Then
              VSTwain1.UnitOfMeasure = 0          ' inches
              VSTwain1.PixelType = 0              ' black-white image
              VSTwain1.Resolution = 200           ' 200 dpi
              If VSTwain1.Duplex <> 0 Then
                  VSTwain1.DuplexEnabled = True   ' enable duplex
              End If
              If VSTwain1.FeederPresent = 1 Then
                  VSTwain1.XferCount = -1
                  VSTwain1.FeederEnabled = True
                  VSTwain1.AutoFeed = True
                  If VSTwain1.FeederLoaded = 1 Then
                      VSTwain1.Acquire()
                  End If
              End If
          End If
      End If
  End Sub

  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
      If Flag <> 0 Then
          If VSTwain1.ErrorCode <> 0 Then
              MsgBox VSTwain1.ErrorString
          Else
              VSTwain1.StopDevice()
              MsgBox "Scan completed."
          End If
      Else
          Dim currNoiseLevel As Single
          If VSTwain1.IsBlankImage(0, 0.01, currNoiseLevel) = 1 Then
            documentsCounter = documentsCounter + 1
          End If
          If VStwain1.SaveImage(0,"c:\documents\doc"+Str(documentsCounter)+".tiff") = 0 Then
            MsgBox VSTwain1.ErrorString
          End If
      End If
  End Sub

 

 

Могу я использовать patch-коды для разделения пакетных заданий? Если да, как мне определить конец пакетного задания?

Вы можете разделять пакетные задания, если будете использовать возможность CAP_JOBCONTROL.

Вот пример для Visual Basic:

  Dim jobsCounter As Integer
  
  Private Sub Form_Load()
    jobsCounter = -1
  End Sub
  
  Private Sub Scan_Click()
    VSTwain1.StartDevice
    VSTwain1.MaxImages = 1
    VSTwain1.ShowUI = 0
    VSTwain1.DisableAfterAcquire = 1
    VSTwain1.TiffMultiPage = 1
    VSTwain1.OpenDataSource
    ' 1 - Detect and include job separator and continue scanning.
    ' 3 - Detect and exclude job separator and continue scanning.
    VSTwain1.JobControl = 1
    jobsCounter = jobsCounter + 1
    VSTwain1.Acquire
  End Sub
  
  Private Sub VSTwain1_PostScan(ByVal Flag As Long)
    If Flag <> 0 Then
      If VSTwain1.ErrorCode <> 0 Then
        MsgBox (VSTwain1.ErrorString)
      End If
    Else
      If VSTwain1.EndOfJob = 1 Then
        jobsCounter = jobsCounter + 1
      Else
        VSTwain1.SaveImage 0, "c:\job"+Str(jobsCounter)+".tif"
      End If
    End If
  End Sub
  .....

 

 

Я должен знать когда изображение будет получено в программе, но я не могу использовать событие PostScan. Как мне решить эту проблему?

Начиная с версии 3.0 Вы можете воспользоваться методом AcquireModal чтобы решить эту проблему.

Вот пример для Visual Basic:

  VSTwain1.AppProductName = "MyTwainApplication"
  If VSTwain1.StartDevice() Then
      VSTwain1.SelectSource
      VSTwain1.ShowUI = True
      While VSTwain1.AcquireModal() = 1
          Set Image1.Picture = VSTwain1.GetCurrentImage()
          If VSTwain1.SaveImage(0, "c:\test.tiff") = 0 Then
              MsgBox (VSTwain1.ErrorString)
          End If
      Wend
  Else
      MsgBox VSTwain1.ErrorString
  End If

 

 

Могу я получить изображения с глубиной цвета в 48 бит на пиксел?

Да. Библиотека VintaSoftTwain.NET позволяет получить 48-битные цветные изображения или 16-битные серые изображения. Изображения могут быть сохранены без потери глубины цвета только в TIFF файлы.

Здесь приведен пример демонстрирующий как получить 48-битное цветное изображение со сканера без пользовательского интерфейса:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 2       ' RGB
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 16       ' 16 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()
Здесь приведен пример демонстрирующий как получить 24-битное цветное изображение со сканера без пользовательского интерфейса:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 2       ' RGB
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 8        ' 8 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()
Здесь приведен пример демонстрирующий как получить 16-битное серое изображение со сканера без пользовательского интерфейса:
  VSTwain1.OpenDataSource()
  VSTwain1.PixelType = 1       ' Gray
  VSTwain1.Capability = 4395   ' IBitDepth
  VSTwain1.CapType = 1         ' One value
  VSTwain1.CapValue = 16       ' 16 bits per color component
  VSTwain1.SetCap()
  VSTwain1.Acquire()

 

 

Когда я использую сканер HP ScanJet теряется пол дюйма в верхней части изображения и добавляется черный прямоугольник высотой в пол дюйма в нижней части изображения. Почему?

Для решения этой проблемы Вам нужно изменить значение свойства pageSize с A4 на USLETTER.

 


 

Могу я сохранить полученные изображения в OLE-поле таблицы MS Access?

Да. Вы можете сделать это. Для этого необходимо использовать метод GetImageAsDIB.

Вот пример для MS Access ("OrderImage" это OLE-поле таблицы):

Option Compare Database
Option Explicit

Private Sub Form_AfterUpdate()
    On Error GoTo error1
    Image1.PictureData = Me![OrderImage]
    Exit Sub
error1:
    Image1.Picture = ""
End Sub

Private Sub Form_Current()
    On Error GoTo error1
    Image1.PictureData = Me![OrderImage]
    Exit Sub
error1:
    Image1.Picture = ""
End Sub

Private Sub BAcquire_Click()
    With VSTwain1
        .StartDevice()
        If .SelectSource() = 1 Then
            .AutoCleanBuffer = 1
            .MaxImages = 1
            .ShowUI = 1
            .Acquire()
        End If
    End With

End Sub

Private Sub VSTwain1_PostScan(ByVal Flag As Long)
    If Flag <> 0 Then
        If VSTwain1.ErrorCode <> 0 Then
            MsgBox VSTwain1.ErrorString
        End If
    Else
        If VSTwain1.NumImages > 0 Then
            If IsNull(Me!OrderName) Then ' a new record?
                Me![OrderName] = " "
                Me![OrderName] = "Order N" + Str(Me!Index)
            End If
            
            Me![OrderImage] = VSTwain1.GetImageAsDIB(0)
            If VSTwain1.ErrorCode <> 0 Then
                MsgBox VSTwain1.ErrorString
            End If
            Form.Refresh
        End If
    End If
End Sub

 

 

Могу я сохранять полученные изображения в таблице MS SQL сервера?

Да. Вы можете сделать это. Для этого необходимо использовать метод GetImageAsDIB.

Вот пример для C# как сохранить изображение в таблицу SQL сервера:

  private void SaveToSql_Click(object sender, System.EventArgs e)
  {
     byte[] dib = (byte[]) VSTwain1.GetImageAsDIB(0);
     int imageSize = 14 + dib.Length;
     int imageOffset = 14 + 40;
     int imageBPP = VSTwain1.GetImageBPP(0);
     if (imageBPP == 1) imageOffset += 2*4;
     else if (imageBPP == 8) imageOffset += 256*4;
     
     byte[] image = new byte[imageSize];
     Array.Clear(image,0,imageSize);
   
     // BITMAPFILEHEADER
     image[0] = (byte)'B';
     image[1] = (byte)'M';
     image[2] = (byte)(imageSize&0xFF);
     image[3] = (byte)((imageSize&0xFF00)>>8);
     image[4] = (byte)((imageSize&0xFF0000)>>16);
     image[5] = (byte)((imageSize&0xFF000000)>>24);
     image[10] = (byte)(imageOffset&0xFF);
     image[11] = (byte)((imageOffset&0xFF00)>>8);
     image[12] = (byte)((imageOffset&0xFF0000)>>16);
     image[13] = (byte)((imageOffset&0xFF000000)>>24);
   
     Array.Copy(dib,0,image,14,dib.Length);
     
     // Insert the image into the database
     SqlConnection myConnection = new SqlConnection (@"server=(local);
						database=northwind;uid=sa;pwd=");
     try
     {
        myConnection.Open();
        SqlCommand myCommand = new SqlCommand("DELETE FROM Images WHERE ImageID=1",
						myConnection);
        myCommand.ExecuteNonQuery();
        myCommand = new SqlCommand ("INSERT INTO Images " 
        	+ "(Image, ImageID) VALUES (@Image, @ImageID)", myConnection);
        myCommand.Parameters.Add("@Image", image);
        myCommand.Parameters.Add("@ImageID", 1);
        myCommand.ExecuteNonQuery();
        MessageBox.Show("Image is saved successfully.");
     }
     finally 
     {
        myConnection.Close();
     }		
  }
А вот пример для C# как получить ранее сохраненное изображение из таблицы SQL сервера:
  private void BGetImageFromSql_Click(object sender, System.EventArgs e)
  {
     SqlConnection myConnection = null;
     try    
     {        
        myConnection = new SqlConnection(@"server=(local);
					database=northwind;uid=sa;pwd=");
        SqlCommand myCommand = new SqlCommand("SELECT Image FROM Images WHERE ImageID=1",
					myConnection);
        myConnection.Open();                
        
        // Get the image from the database.        
        byte[] imagedata = (byte[])myCommand.ExecuteScalar();        
        if (imagedata != null)        
        {
           if (pictureBox1.Image != null)
           {
              pictureBox1.Image.Dispose();
              pictureBox1.Image = null;
           }
           MemoryStream stream = new MemoryStream(imagedata);
           pictureBox1.Image = new Bitmap(stream);
           MessageBox.Show("Image is loaded successfully.");
        }        
        else        
        {            
           MessageBox.Show("Image does not exist in database.");
        }    
     }    
     finally    
     {        
        myConnection.Close();    
     }		
  }

 

 

Я использую Visual FoxPro и у меня не возникает событие PostScan. Почему?

Для решения этой проблемы необходимо добавить команду Application.AutoYield = .F. в начало приложения.