Главная | Загрузить | Регистрация | Отзывы | Тех.поддержка English version   Deutsche Version   Русская версия   Português versião   Española versión   Version francaise


VintaSoftTwain ActiveX компонент   Информация Инфо  Лицензионное соглашение Лицензия  FAQ FAQ  Примеры Примеры  Загрузить Загрузить  Купить Купить



Основные вопросы:
  • Для каких целей могу я использовать VintaSoftTwain ActiveX компонент?
  • В каких языках программирования могу я использовать это ActiveX компонент?
  • Какие ограничения имеет незарегистрированная версия компонента?
  • Я не нашел ответа на свой вопрос. Что мне делать?

  • Распространение:
  • Могу я распространять этот ActiveX компонент вместе с моим приложением?
  • Какие файлы мне нужно включать в дистрибутив моей программы?
  • Я создал программу в Visual Studio .NET. Какие шаги должен я выполнить для корректной установки моей программы на компьютере клиента?
  • При регистрации ActiveX в Windows 98 я получаю сообщение об ошибке. Что мне делать?
  • Я создал программу в Delphi. Программа работает корректно, если она запущена с правами администратора, но если запустить программу с правами Гостя, то возникает следующее сообщение "Exception EOleSysError in module...". Как решить эту проблему?

  • Установка:
  • Как мне добавить объект VintaSoftTwain на форму в проекте VB.NET?
  • Я хочу использовать ActiveX в Delphi 2005, но дизайнер форм не позволяет добавлять ActiveX компоненты на форму приложения. Возникает следующая ошибка "Failed to add a reference to the ActiveX type library. Ensure that it is properly registered. ...". Как решить эту проблему?
  • Как мне динамически добавить VintaSoftTwain объект в мой проект на VB?
  • Я пытаюсь использовать ActiveX в среде Windows 2003 Server, но возникает ошибка "Error at loading the TWAIN_32.DLL". Как решить эту проблему?
  • Мне не удается добавить объект VintaSoftTwain на форму приложения в среде VS .NET 2005. Как решить эту проблему?

  • Веб установка:
  • Как мне подписать мою копию компонента, чтобы использовать его на моей веб странице?
  • Какие шаги мне нужно выполнить чтобы добавить ActiveX к моему интернет проекту?
  • Как могу я загрузить изображение полученное со сканера на веб сервер?
  • Я пытаюсь выбрать устройство с помощью свойства sourceIndex в Internet Explorer, но получаю ошибку. Почему?

  • Вопросы по программированию:
  • Как мне получить черно-белые изображения (документы)?
  • Язык программирования который я использую не поддерживает работу с массивами. Как мне обойти эту проблему?
  • Могу я управлять лотком автоматической подачи документов без пользовательского интерфейса?
  • Можно ли создать консольное приложение используя этот ActiveX компонент?
  • Могу я выбрать нужное мне устройство без стандартного диалога выбора устройства?
  • Как мне отключить окно индикатора процесса сканирования при получении изображений без пользовательского интерфейса?
  • Мне нужно отсканировать только часть изображения. Как это сделать?
  • Как мне установить разное разрешение для оси X и Y во время сканирования изображений?
  • Как мне выбрать ориентацию изображения при сканировании?
  • Наша организация испрользует сетевой сканер с автоматической подачей листов (ADF) и мы обрабатываем множество документов каждый день. Как мы можем автоматизировать нашу работу? Хотелось бы сохранять каждый документ в отдельном файле.
  • Могу я использовать patch-коды для разделения пакетных заданий? Если да, как мне определить конец пакетного задания?
  • Я должен знать когда изображение будет получено в программе, но я не могу использовать событие PostScan. Как мне решить эту проблему?
  • Могу я получить изображения с глубиной цвета в 48 бит на пиксел?
  • Когда я использую сканер HP ScanJet теряется пол дюйма в верхней части изображения и добавляется черный прямоугольник высотой в пол дюйма в нижней части изображения. Почему?

  • Базы данных:
  • Могу я сохранить полученные изображения в OLE-поле таблицы MS Access?
  • Могу я сохранять полученные изображения в таблице MS SQL сервера?
  • Я использую Visual FoxPro и у меня не возникает событие PostScan. Почему?


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


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

    Лицензия для сервера позволяет использовать компонент в:
  • VBScript
  • JavaScript
  • любых других языках основывающихся на 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 установлена на компьютере.
  • Зарегистрируйте 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" на компьютер - это должно решить проблему.


     
    Я создал программу в 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. ...". Как решить эту проблему?
    Вот список шагов позволяющих решить данную проблему:
  • Удалить ActiveX из панели компонентов (Tools Palette)
  • Сменить вариант языка установленный в компьютере на "US Locale"
  • Перезагрузить компьютер
  • Заново добавить ActiveX в панель компонентов - все должно заработать.


     
    Как мне динамически добавить VintaSoftTwain объект в мой проект на VB?
    Необходимо сделать следующее:
    1. Открыть пункт меню "Project -> References".
    2. В открывшемся окне добавить ссылку на объект "VintaSoftTwain ActiveX Control".
    3. Далее нужно добавить следующий код к проекту:
      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 на форму Вашего приложения без каких либо проблем.


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


     
    Какие шаги мне нужно выполнить чтобы добавить ActiveX к моему интернет проекту?
    Вам необходимо выполнить следующие шаги:
    1. Добавить файл vstwain.dll на сервер.
    2. В HTML коде исправить следующие строки.
      // В коде примера:
      <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
              CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
              CODEBASE="">
      </OBJECT>
    
      // Должно быть в Вашем коде:
      <OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1
              CLASSID="CLSID:1169E0CD-9E76-11D7-B1D8-FB63945DE96D"
              CODEBASE="http://www.your-server.ru/activex/vstwain.dll#version=4,0,0,3">
      </OBJECT>
    
    После всех этих шагов Вам не придется устанавливать ActiveX компонент на всех компьютерах Вашей организации. Когда пользователь откроет страницу с компонентом ему будет выдан запрос на установку компонента на его компьютер. Если он согласится на установку, то компонент будет автоматически установлен на его компьютер и он сможет работать с Вашей веб страницей.

    Если необходимо, то ActiveX можно поместить в CAB файл: (CODEBASE="http://www.your-server.ru/activex/vstwain.cab").


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

    ASP скрипт содержит следующие поля:
  • Текстовое поле "Demo"
  • Поле для файла "txtFile"
  • Кнопку "cmdSubmit"

    и для загрузки изображений через этот скрипт необходимо использовать следующий код:
      If VSTwain1.SetHttpServerParams("http://www.your-server.ru/clsUploadTest.asp",
                     "http://www.your-server.ru/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.ru/cgi/upload.cgi",
                     "http://www.your-server.ru/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   ' второе устройство
      VSTwain1.Acquire()
    

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

     
    Язык программирования который я использую не поддерживает работу с массивами. Как мне обойти эту проблему?
    Если Вам необходимо получить массив значений с помощью методов GetPageSizes, GetPixelTypes, GetResolutions, GetUnitsOfMeasure, но используемый Вами язык программирования не поддерживает работу с массивами, тогда Вы можете использовать следующий метод:
      ' Этот пример показывает как получить типы изображений поддерживаемых устройством
      VSTwain1.StartDevice()
      VSTwain1.OpenDataSource()
      bSupportBW = 0
      VSTwain1.pixelType = 0           ' черно-белые изображения (1 бит на пиксел)
      If VSTwain1.errorCode = 0 Then   ' черно-белые изображения поддерживаются устройством
        bSupportBW = 1
      End If
      bSupportGray = 0
      VSTwain1.pixelType = 1           ' серые изображения (8 бит на пиксел)
      If VSTwain1.errorCode = 0 Then   ' серые изображения поддерживаются устройством
        bSupportGray = 1
      End If
      bSupportRGB = 0
      VSTwain1.pixelType = 2           ' RGB (24 бита на пиксел)
      If VSTwain1.errorCode = 0 Then   ' цветные (RGB) изображения поддерживаются устройством
        bSupportRGB = 1
      End If
      ...................
    

     
    Могу я управлять лотком автоматической подачи документов без пользовательского интерфейса?
    Вот пример показывающий как можно управлять работой сканера с лотком автоматической подачи документов без пользовательского интерфейса:
      Private Sub StartScan()
          VSTwain1.StartDevice()
          If VSTwain1.SelectSource() = 1 Then ' если пользователь выбрал устройство
              VSTwain1.showUI = False         ' выключить пользов.интерфейс
              VSTwain1.disableAfterAcquire = True
              VSTwain1.maxImages = 1
              VSTwain1.autoCleanBuffer = True
              VSTwain1.tiffMultiPage = True   ' создавать много страничный TIFF файл
              VSTwain1.tiffCompression = 10   ' автоматически определять лучший алг.сжатия
              If VSTwain1.OpenDataSource() = 1 Then
                  VSTwain1.unitOfMeasure = 0  ' дюймы как основная един.измерений
                  VSTwain1.pixelType = 0      ' сканировать черно-белые изображения
                  VSTwain1.resolution = 200   ' разрешение - 200 dpi
                  If VSTwain1.feederPresent = 1 Then
                      VSTwain1.feederEnabled = True
                      If VSTwain1.duplex <> 0 Then
                          VSTwain1.duplexEnabled = True
                      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
              End If
          Else
              VStwain1.SaveImage VSTwain1.NumImages-1, "c:\test.tiff"
              If VSTwain1.dataSourceState = 0 Then
                  VSTwain1.StopDevice()
                  MsgBox "Scan completed."
              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
      VSTwain1.Acquire
    

     
    Мне нужно отсканировать только часть изображения. Как это сделать?
    Используйте следующий код чтобы получить часть изображения ограниченную прямоугольником (0.2,0.2) - (8.3,10.8)
      VSTwain1.StartDevice()
      VSTwain1.showUI = False
      VSTwain1.OpenDataSource()
      .............
      VSTwain1.unitOfMeasure = 0                 ' дюймы
      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   ' дюймы
      VSTwain1.capability = 4376   ' ICAP_XRESOLUTION (0x1118)
      VSTwain1.capType = 1
      VSTwain1.capValue = 4800     ' 4800 dpi
      VSTwain1.SetCap
      VSTwain1.capability = 4377   ' ICAP_YRESOLUTION (0x1119)
      VSTwain1.capType = 1
      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 ' выбор устройства
              VSTwain1.showUI = False ' отключение польз.интерф.
              VSTwain1.disableAfterAcquire = True
              VSTwain1.maxImages = 1
              VSTwain1.autoCleanBuffer = True
              VSTwain1.tiffMultiPage = True
              VSTwain1.tiffCompression = 10
              If VSTwain1.OpenDataSource() = 1 Then
                  VSTwain1.unitOfMeasure = 0
                  VSTwain1.pixelType = 0
                  VSTwain1.resolution = 200
                  If VSTwain1.duplex <> 0 Then
                      VSTwain1.duplexEnabled = True
                  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
              End If
          Else
              If VSTwain1.IsBlankImage(0) = 1 Then
                documentsCounter = documentsCounter + 1
              End If
              If VStwain1.SaveImage(0,"c:\documents\doc"+
                                    Str(documentsCounter)+".tiff") = 0 Then
                MsgBox VSTwain1.errorString
              End If
              If VSTwain1.dataSourceState = 0 Then
                  VSTwain1.StopDevice()
                  MsgBox "Scan completed."
              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 бит на пиксел?
    Да. Начиная с версии 3.0 появилась возможность получать цветные изображения с глубиной цвета в 48 бит на пиксел и серые изображения с глубиной цвета в 16 бит на пиксел. Эти изображения могут быть сохранены без потери глубины цвета только в файлах формата TIFF.


     
    Когда я использую сканер 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 ' новая запись?
                    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. в начало приложения.




  • Copyright © 2008 "ВинтаСофт". Все права защищены.