Info sobre o produto
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:
Com a licença Servidor você pode usar o ActiveX em:
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:
Quando você distribuir o seu programa você precisa:
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:
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.
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:
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:
Como criar dinamicamente o objeto VintaSoftTwain no meu projeto VB?Você precisa seguir os seguintes passos:
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:
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?
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:
// 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:
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:
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.AcquireMas 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:
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.
|