Info sobre o produto


Visão geral

Licenciamento

FAQ

Forums

Exemplos

History


Download

Versão de avaliação

On-line manual

Recomendações


VintaSoftTwain ActiveX Control - Questões Freqüentes (FAQ)

Questões gerais:

 

Redistribuição:

 

Instalação:

 

Servidor instalação:

 

Programação:

 

Bases de dados:

 

 

Para que propósito posso usar o VintaSoftTwain ActiveX Control?

O ActiveX pode ser usado para controlar o trabalho de scanners, web câmeras (webcam) e qualquer outro dispositivo que suporte o padrão TWAIN.

 


 

Em que linguagem de programação posso usar este controle ActiveX?

Com a licença individual para desenvolvedor ou para várias estações de trabalho você pode usar o ActiveX em:

  • 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)
  • qualquer linguagem que suporte trabalhar com os controles ActiveX.

Com a licença Servidor você pode usar o ActiveX em:

  • Internet Explorer 5.0 e acima : ASP.NET, PHP, JavaScript, VBScript, etc
  • Mozilla Firefox 3.0 e acima com o IE Tab Plug-in : ASP.NET, PHP, JavaScript, VBScript, etc
  • qualquer linguagem que seja baseado em HTML.

 

 

Que restrições a versão não registrada tem?

A versão não registrada tem a tela de propaganda. Nesta versão você pode salvar apenas imagens em preto-e-branco e cinza. Todas estas restrições são removidas na versão registrada. Por favor, veja como adquirir imagens em preto-e-branco e cinza aqui. Você pode testar todas as características ActiveX com estes tipos de imagens.

 

 

Eu tenho problemas. O que eu devo fazer?

A informação para a maioria das questões podem ser achados na documentação ou neste FAQ. Escreva para o nosso suporte para obter mais ajuda.

 


 

Posso redistribuir este controle ActiveX com minha aplicação sem pagar royalties?

Sim, este componente é livre de royalties. Você paga apenas pelo registro uma única vez. Apenas o VSTwain.dll pode ser distribuído junto com sua aplicação. A licença Individual de Desenvolvedor (Single Developer) tem limitação de distribuição. Por favor, leia o contrato de licença para mais informações.

 


 

Que arquivos eu preciso incluir no pacote de instalação do meu programa?

Você precisa incluir apenas um arquivo: vstwain.dll.
Depois da instalação do seu programa em um computador que ainda não tem o programa, por favor, registre o controle ActiveX pelo programa regsvr32.exe (regsvr32.exe vstwain.dll).

 


 

Eu criei meu programa no Visual Studio.NET. O que eu preciso fazer para instalar corretamente o meu programa no computador cliente?

Antes de distribuir o seu programa:

  • Verifique e remova todas referências AxVSTWAINLib e VSTWAINLib de “References” e insira novamente (Add Reference) pela instalação padrão do VintaSoftTwain ActiveX.
  • Verifique se a propriedade Copy Local de AxVSTWAINLib.dll e VSTWAINLib.dll são Falsos.
  • Depois que seu programa for compilado você precisa adicionar três arquivos junto com o sua instalação: vstwain.dll, AxInterop, VSTWAINLib.dll, Interop. VSTWAINLib.dll (os dois últimos arquivos serão gerados pelo Visual Studio.Net).

Quando você distribuir o seu programa você precisa:

  • Verificar se existe a instalação do framework .NET. Se a maquina não tem o framework .NET então esta instalação (dotnetfx.exe) deve ser feito antes de tudo.
    Existe uma documentação sobre como usar o ActiveX no .NET: “Using ActiveX Controls with Windows Forms in Visual Studio .NET Upgrading to Microsoft .NET” e sobre a redistribuição: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/vsredistdeploy.asp
  • Além disto, também é necessário registrar o ActiveX (regsvr32.exe vstwain.dll).

 

 

Quando eu tento registrar VSTwain.dll no Windows 98 é mostrada uma mensagem de erro. O que eu preciso fazer para resolver este problema?

Este problema é devido às dependências. O ActiveX tem as seguintes dependências:

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

Estas bibliotecas já estão incluídas no Windows Me, 2000, XP como padrão. Mas no Windows 95 e 98 você precisa verificar se estas bibliotecas estão presentes no sistema.

Por favor, instale o Visual C++ executar arquivos no computador tempo para resolver este problema. Esta configuração do pacote pode ser baixado a partir deste link: http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe

 

 

Eu criei meu programa no Delphi. O programa funciona corretamente quando está logado como administrador, mas quando o usuário está logado como visitante a seguinte mensagem é mostrada ao iniciar o programa “Exception EOleSysError in module...”. Como resolver este problema?

Antes de tudo, é necessário registrar o ActiveX no sistema pelo programa register32.exe. Esta operação precisa ser feita como usuário administrador.

Também é necessário adicionar o seguinte código no seu programa:

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.

Este código permite verificar se o programa já está registrado no sistema e permite executar o programa com direitos de visitante.

 

 

Como adicionar o objeto VintaSoftTwain em um form do meu projeto VB.NET?

Para adicionar o objeto VintaSoftTwain em seu form você precisa fazer o seguinte:
  • Inicialize seu Visual Studio.NET com seu próprio projeto
  • Abra o form principal em design view
  • Abra o Toolbox pane
  • Clique com o botão direito no Toolbox pane
  • Selecione “Add/Remove Items...” item do menu popup
  • Abra o tab do Components COM
  • Clique “Browse...” e selecione o arquivo VSTwain.dll
  • Procure e cheque na lista o VintaSoftTwain Class
  • Feche a janela usando o botão OK
  • Procure e selecione no Toolbox pane o item VintaSoftTwain
  • Coloque o item VintaSoftTwain sobre o form selecionando o controle retângulo

 

 

Eu gostaria de usar o ActiveX no Delphi 2005, mas o forms designer não aceita os controles ActiveX no Form. O Delphi apresenta a mensagem de erro “Failed to add a reference to the ActiveX type library. Ensure that it is property registered. …” Como resolver esse problema?

Borland Delphi 8.0 (2005) e Borland C# Builder 1.0 tem um bug e eles somente aceitam controle ActiveX se estiver configurado a localidade US. Outras localidades são ignoradas.

Aqui estão alguns passos que podem ajudar a resolver este problema:

  • Desinstale os controles ActiveX
  • Mude a localidade para US
  • Reboot
  • Reinstale o controle ActiveX, e... voila! Agora funciona.

 

 

Como criar dinamicamente o objeto VintaSoftTwain no meu projeto VB?

Você precisa seguir os seguintes passos:
  • Vá para o menu “Project -> References”.
  • Na janela aberta você precisa adicionar a referência para o objeto “VintaSoftTwain ActiveX Control”.
  • Depois você precisa adicionar o seguinte código no seu projeto:
  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

 

 

Eu estou tentando usar o VintaSoftTwain ActiveX no Windows Server 2003, mas sempre aparece a mensagem de erro “Error at loading the TWAIN_32.DLL”. Como resolver esse problema?

Sua versão do Windows Server 2003 tem um erro na configuração: A funcção GetWindowsDirectory retorna o path incorreto para o diretório do Windows, “C:\Documents and Settings\User\Windows\” instead of “C:\Windows\”.
Por favor, leia este artigo que pode ajudar você a resolver esse problema: http://support.microsoft.com/kb/832048.

 


 

Eu não consigo adicionar o VintaSoftTwain ActiveX para um Form em uma aplicação do VS .NET 2005. Como resolver este problema?

Você precisa adicionar uma referência à biblioteca “stdole” para seu projeto, antes de inserir um objeto VintaSoftTwain em seu form. Aqui alguns passos necessários:

  • Clique com o botão direito em “References”
  • Selecione o item “Add reference” no popup menu
  • Vá para a aba “COM”
  • Procure e deixe selecionado a opção “OLE Automation” na lista
  • Feche a janela usando o botão OK

 

 

Quando eu tento arrastar o controle ActiveX do toolbox para o form do MS Visual Studio 2005, o seguinte erro acontece: "Error message: Failed to import the ActiveX control". Existe um jeito de resolver isto?

  • Arraste o controle VintaSoftTWAIN ActiveX do toolbox para o form. Este erro irá ocorrer: "Failed to import the ActiveX control. Please ensure it is properly registered."
  • Reconstrua o projecto, selecione "Build > Rebuild Solution".
  • Pela segunda vez, arraste o Controle VintaSoftTWAIN ActiveX do toolbox para o form. Um erro desconhecido vai ocorrer novamente.
  • Recontrua o projeto pela segunda vez, selecione "Build > Rebuild Solution".
  • Arraste o Controle VintaSoftTWAIN do toolbox para o form pela terceira vez e o controle ActiveX será importado com sucesso.

 

 

Como assinar minha cópia do ActiveX para usar na minha própria web page?

VinstaSoftTwain ActiveX é assinado pela certificação do Thawte.
Por favor, contacte-nos, se você quiser assinar sua cópia do VintaSoftTwain ActiveX por seu próprio certificado.

 


 

Quais os passos para adicionar o ActiveX no meu projeto web?

Você precisa seguir os seguintes passos:

  • Adicione o vstwain.dll arquivo no servidor.
  • No seu arquivo HTML você precisa mudar a base do código para ActiveX.
  // 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>

Neste caso você não precisa instalar o ActiveX em todos os computadores da sua empresa. Quando o usuário abrir uma página twain ele automaticamente instala o ActiveX em seu computador.

VSTwain.cab file can be found in "Bin" directory of the distributive package.

 

 

Como posso fazer para enviar uma imagem adquirida para um servidor Web?

O protocolo HTTP não permite salvar arquivos diretamente no servidor Web (HTTP). Para este propósito você precisa usar um especializado web-script. Este script precisa ser colocado no servidor e apenas por meio deste script você pode enviar os arquivos para o servidor. Você pode achar muitos scripts na Internet ou usar um dos seguintes scripts: ASP script, Perl script.

Para enviar imagens para o servidor via script é necessário saber que campos o script contém.

ASP script contém os seguintes campos:

  • campo texto com o nome “Demo”
  • campo arquivo com o nome “txtFile”
  • botão com o nome “cmdSubmit”

E você precisa usar o seguinte código para enviar as imagens via script:

  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

O script Perl contem os seguintes campos:

  • campo texto como o nome “login”
  • campo texto como o nome “pass”
  • campo arquivo com o nome “file”

E você precisa usar o seguinte código para enviar as imagens via script:

  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

Por favor, veja nossos exemplos.

 

 

Eu estou tentado selecionar um dispositivo com a propriedade SourceIndex no Internet Explorer, mas eu obtenho apenas erros. Por que?

Cada objeto da página web no Internet Explorer tem uma propriedade SourceIndex. Esta propriedade é read-only. Você precisa usar o seguinte código para trabalhar com uma propriedade SourceIndex de um objeto VSTwain no JavaScript ou VBScript:
  VSTwain1.StartDevice()
  VSTwain1.object.SourceIndex = 1     ' second device
  VSTwain1.Acquire()

 

 

Posso usar o ActiveX no Mozilla Firefox?

Sim, você pode usar o ActiveX no Mozilla Firefox 3.0 e versões acima com habilitado o IE Tab Plug-in.

 


 

Posso obter imagens em preto-e-branco?

Aqui um exemplo de código para adquirir apenas imagens em preto-e-branco:
  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

 

 

A linguagem de programação que eu uso não suporta trabalhar com arrays. Como resolver este problema?

Se você quer obter valores de um array dos métodos GetPageSizes, GetPixelTypes, GetResolutions, GetUnitOfMeasure, mas sua linguagem não suporta trabalhar com arrays, você pode usar o seguinte método:
  ' 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
  ...................

 

 

Como trabalhar com ADF sem a interface com o usuário?

Aqui um exemplo de código para usar um scanner sem a mostrar a tela de seleção de dispositivo:
  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

 

 

Posso criar uma aplicação console usando este componente?

Você não pode criar uma aplicação console com este controle ActiveX. Sua aplicação precisa ter uma janela própria para trabalhar com o VintaSoftTwain ActiveX.

 


 

Como faço para usar um dispositivo sem precisar selecioná-lo nas opções da janela de diálogo?

Você pode usar o seguinte código para enumerar seus dispositivos:
  VSTwain1.StartDevice
  For i = 0 To VSTwain1.SourcesCount - 1
     MsgBox VSTwain1.GetSourceProductName(i)
  Next
E esse código para o primeiro dispositivo selecionado:
  VSTwain1.StartDevice
  VSTwain1.SourceIndex = 0
  .....
  VSTwain1.Acquire
Mas o seguinte jeito é melhor:
  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
  .....
Neste caso você precisa selecionar o nome correto do dispositivo.

 

 

Como posso desabilitar a janela de indicador de progresso quando eu adquiro uma imagem sem a interface gráfica?

O padrão TWAIN permite você desabilitar o indicador de progresso quando showUI = False. Isto pode ser feito dessa forma:
  VSTwain1.StartDevice
  VSTwain1.ShowUI = False
  VSTwain1.DisableAfterAcquire = True
  VSTwain1.MaxImages = 1
  VSTwain1.OpenDataSource
  VSTwain1.ShowIndicators = 0     ' disable indicator window
  VSTwain1.Acquire

 

 

Eu quero escanear apenas parte da imagem. Como faço isso?

Você pode usar o seguinte código para adquirir somente parte da imagem limitado por um relangulo (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()

 

 

Posso configurar diferentes resoluções em direções X e Y?

Sim. Aqui um código exemploi de como configurar X para resolução 4800 dpi e Y para a resolução 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

 

 

Como eu posso configurar o scanner para a orientação Retrato ou Paisagem?

Se o scanner suporta a capacidade ICAP_ORIENTATION então você pode usar a orientação Paisagem assim:
  .....
  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
  .....

Valores possíveis de orientação:

  • 0   Orientação Retrato, Rotação 0 graus
  • 1   Rotação 90 graus
  • 2   Rotação 180 graus
  • 3   Orientação Paisagem, Rotação 270 graus

 

 

Nossa empresa tem um scanner na rede com ADF e nós escaneamos muitos documentos por dia. Como podemos automatizar nosso trabalho? Nós queremos salvar cada documento em um arquivo separado.

Você pode usar uma página em branco para separar os documentos e detectar a página em branco, como o delimitador dos documentos, pelo método IsBlankPage. Aqui um exemplo:
  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

 

 

Posso usar códigos patch para separar as tarefas em batch? Se sim, como posso detectar o fim das tafefas em batch?

Você pode detectar as tarefas em batch usando a capacidade CAP_JOBCONTROL.

Aqui um exemplo para o 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
  .....

 

 

Eu preciso esperar enquanto o processo de aquisição de imagens é finalizada, mas eu não posso usar um evento PostScan em meu programa. Como resolvo este problema?

Você pode usar o método AcquireModal para resolver este problema.

Aqui um exemplo para 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

 

 

Posso obter imagens de 48-bit?

Sim. O VintaSoftTwain.NET SDK permite obter imagens coloridas 48-bit ou imagens em tons cinza 16-bit. Imagens podem ser salvas sem perda de bit depth apenas em arquivos TIFF.

Aqui está um exemplo que mostra como obter imagens coloridas 48-bpp sem o UI do scanner:
  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()
Aqui está um exemplo que mostra como obter imagens coloridas 24-bpp sem o UI do scanner:
  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()
Aqui está um exemplo que mostra como obter imagens cinza 16-bit sem o UI do scanner:
  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()

 

 

Quando eu estou usando o scanner HP Scanjet, eu estou perdendo a parte superior ½ inch do que foi escaneado – e existe uma parte extra ½ inch de espaço em branco na parte inferior. Como posso resolver esse problema?

Você precisa trocar o valor da propriedade pageSize de A4 para USLETTER e assim poderá resolver o problema.

 


 

Posso salvar imagens adquiridas no campo OLE de tabelas MS Access?

Sim. Você pode fazer isso. Para isto é necessário usar o método GetImageAsDIB.

Aqui um exemplo para MS Access (“OrderImage” é um campo OLE da tabela):

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

 

 

Posso salvar imagens adquiridas em uma tabela no MS SQL Server?

Sim. Você pode fazer isso. Para este fim é necessário usar o método GetImageAsDIB.

Aqui um exemplo para C# de como salvar imagens em tabela no MS SQL server:

  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();
     }		
  }
Aqui um exemplo para C# de como obter imanges de uma tabela no MS SQL server:
  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();    
     }		
  }

 

 

Eu estou usando Visual FoxPro e o evento PostScan não está sendo disparado (chamado). Por que?

O commando Application.AutoYield = .F. precisa seu colocando no Visual FoxPro onde o programa começa.