[DELPHI]Scanner de controle em Delphi
---- Ao usar Delphi para desenvolver sistemas de gestão de informação, muitas vezes as imagens são processadas, o que também é uma tendência inevitável no desenvolvimento de sistemas de gestão de informação. Como obter as informações necessárias da imagem através de um scanner em Delphi? Não existem mais do que três métodos básicos:
Através de softwares de processamento de imagens, como Photoshop, etc., por meio de sua função de digitalização de imagens, elas podem ser processadas em imagens em um determinado formato e posteriormente utilizadas em seu próprio sistema;
Através da interface do scanner Twain.DLL. Esta interface é fornecida durante a instalação do scanner. Na verdade, é um plugin que controla o scanner através de uma série de funções;
Controle o scanner através da tecnologia de componentes.
---- Usar o primeiro método pode reduzir a complexidade da programação, mas a integração do sistema não é alta e é inconveniente para os usuários usarem o segundo método pode controlar diretamente o scanner no nível do driver, o que pode;
Fornece máxima flexibilidade e controlabilidade na programação; o terceiro método pode fazer uso total da tecnologia de componentes visuais do Delphi para usar o scanner com segurança, flexibilidade e liberdade. Na verdade, o terceiro método também é
Ele é construído sobre a interface do scanner Twain.DLL. O método discutido neste artigo adota o terceiro método.
---- O Windows9X fornece uma opção de "imagem" em seu anexo, que usa componentes OCX para controlar o scanner. Existem quatro imgEdit, imgAnntool, imgScan e imgAdmin. Com esses quatro componentes, basicamente, tenha controle total sobre o scanner. O uso no Delphi é o seguinte: Selecione a "imagem" de instalação no Windows9x. (Selecione "Adicionar/Remover Programas" no Painel de Controle, selecione "Instalar Windows", clique na caixa de seleção "Acessórios" e encontre "Imagem" no botão "Detalhes")
Inicie o Delphi e selecione “Importar controle ActiveX” no item de menu “Componente”.
Neste momento, você pode ver que existem "Wang Image Editing Control, Wang Image Scanning Control, Wang
Controle de gerenciamento de imagens, controle de miniaturas de imagens Wang", selecione esses quatro itens e clique em "Instalar"
botão, então você pode ver os ícones desses quatro componentes sob o rótulo ActiveX no painel de componentes.
---- Os principais atributos do ImgScan: FileType: o tipo de arquivo da imagem (este componente suporta três
Espécies: TIFF, BMP, AWD);
ScanTo: Retorna ou define a finalidade da imagem digitalizada;
Significado do valor possível
0 (padrão) Exibe a imagem digitalizada.
1 Exiba a imagem digitalizada e grave-a em um arquivo.
2 Grave a imagem em um arquivo
3 Grave a imagem no arquivo no modo modelo e exiba-a.
4. Escreva a imagem no arquivo como modelo
5 Imagem digitalizada por fax
Nota: Se você usar o valor padrão 0,
Deve ser usado em conjunto com o componente Wang ImgEdit.
DestImageControl: nome do componente Wang ImgEdit;
Zoom: a taxa de zoom da imagem
Os principais métodos do ImgScan: OpenScanner: abra o scanner;
CloseScanner: fecha o scanner;
StartScan: inicia a digitalização;
StopScan: Parar a digitalização
----As propriedades do ImgEdit controlam principalmente a resolução da imagem digitalizada, a largura e a altura da imagem e se
Permite seleção parcial de imagens, etc. os principais métodos incluem copiar e recortar imagens para a área de transferência,
Copie imagens da área de transferência, gire, dimensione, espelhe imagens;
---- Instruções detalhadas para os quatro componentes OCX acima podem ser visualizadas no Delphi.
Sistema de ajuda.
---- Aqui estão alguns exemplos de uso desses dois componentes:
Procedimento Tscanf.N1Click(Remetente: TObject);
começar
ImgScan1.ShowSelectScanner;
file://Selecione o scanner instalado no sistema
fim;
procedimento Tscanf.N2Click(Remetente: TObject);
começar
imgedit1.zoom:=100; file://Definir o fator de zoom da imagem
se não for imgscan1.ScannerAvailable então
file://se o scanner selecionado não estiver disponível
imgscan1.OpenScanner;//Abre o scanner
imgscan1.StartScan; file://Iniciar digitalização de imagens
imgscan1.CloseScanner; arquivo://Fechar scanner
fim;
procedimento Tscanf.N8Click(Remetente: TObject);
começar
if (imgedit1.IsClipboardDataAvailable
e imgedit1.ImageDisplayed ) então
imgedit1.ClipboardPaste(selleft,seltop);
file://cola a imagem da área de transferência, seu parâmetro é a coordenada inicial da área de exibição do Imgedit
fim;
procedimento Tscanf.N1801Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
imgedit1.Flip; arquivo://imagem espelhada
fim;
procedimento Tscanf.N901Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
imgedit1.RotateRight file://Girar imagem para a direita
fim;
procedimento Tscanf.N6Click(Remetente: TObject);
começar
imgedit1.DrawSelectionRect(selleleft,
seltop, selwidth, selheight); //realiza seleção parcial da imagem
imgedit1.ClipboardCut(selleft,seltop,
selwidth,selheight); //Corta a área selecionada
fim;
---- Nota: Ao usar as funções de copiar e recortar do componente Imgedit no DELPHI, haverá
As seguintes perguntas:
---- 1. Se você selecionar a imagem inteira, não haverá problema;
---- 2. Se uma área local for selecionada, as áreas copiadas e cortadas serão deslocadas;
---- 3. Se o DELPHI estiver criando a interface do cliente do banco de dados back-end MS SQL, então
Quando o conteúdo da imagem é gravado no campo de imagem do banco de dados, o BDE (mecanismo de banco de dados) reportará um erro. Isso é
DELPHI3.0 e 4.0 BUG, o pacote de atualização 4.0 pode resolver esse problema.
---- Quanto ao segundo problema, ele pode ser resolvido assim: onSelectionRectDrawn no Imgedit
Escreva um trecho de código no evento para salvar o valor limite da área selecionada em quatro variáveis globais após copiar.
Basta usar as variáveis salvas anteriormente para fazer outra seleção antes de cortar (claro, tudo isso acontecerá mais tarde)
etapa, veja exemplo anterior).
---- Ambiente de desenvolvimento: DELPHI4.0, scanner HP ScanJet 4P;
---- Código fonte anexado.
unidade scanu;
interface
usa
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles,
Formulários, Diálogos, Menus, ScanLib_TLB, ExtCtrls, AxCtrls,
OleCtrls, ImgeditLib_TLB;
tipo
Tscanf = classe(TForm)
MainMenu1: TMainMenu;
F1: TMenuItem;
N15: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N16: TMenuItem;
N11: TMenuItem;
N5: TMenuItem;
C1: TMenuItem;
N4: TMenuItem;
E1: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N3: TMenuItem;
N10: TMenuItem;
N9: TMenuItem;
N1801: TMenuItem;
N901: TMenuItem;
N902: TMenuItem;
H1: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
ImgEdit1: TImgEdit;
Bisel1: TBevel;
ImgScan1: TImgScan;
Bisel2: TBevel;
procedimento N4Click(Remetente: TObject);
procedimento N1Click(Remetente: TObject);
procedimento N2Click(Remetente: TObject);
procedimento C1Click(Remetente: TObject);
procedimento N8Click(Remetente: TObject);
procedimento N1801Click(Remetente: TObject);
procedimento N901Click(Remetente: TObject);
procedimento N902Click(Remetente: TObject);
procedimento N6Click(Remetente: TObject);
procedimento N7Click(Remetente: TObject);
procedimento ImgEdit1SelectionRectDrawn(Sender: TObject; Esquerda,Topo,
Largura, Altura: Inteiro);
procedimento N11Click(Remetente: TObject);
privado
{Declarações privadas}
público
selleft,seltop,selwidth,selheight:inteiro;
{Declarações públicas}
fim;
var
scanf: Tscanf;
implementação
{$R *.DFM}
procedimento Tscanf.N4Click(Remetente: TObject);
começar
imgedit1.ClearDisplay;
fechar;
fim;
procedimento Tscanf.N1Click(Remetente: TObject);
começar
ImgScan1.ShowSelectScanner;
fim;
procedimento Tscanf.N2Click(Remetente: TObject);
começar
imagemedit1.zoom:=100;
se não for imgscan1.ScannerAvailable então
imgscan1.OpenScanner;
imgscan1.StartScan;
imgscan1.CloseScanner;
fim;
procedimento Tscanf.C1Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
começar
imgedit1.ClearDisplay;
imagemedit1.zoom:=100;
fim;
fim;
procedimento Tscanf.N8Click(Remetente: TObject);
começar
if (imgedit1.IsClipboardDataAvailable e imgedit1.ImageDisplayed)
então
imgedit1.ClipboardPaste(selleft,seltop);
fim;
procedimento Tscanf.N1801Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
imagemedit1.Flip;
fim;
procedimento Tscanf.N901Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
imgedit1.RotateRight
fim;
procedimento Tscanf.N902Click(Remetente: TObject);
começar
se imgedit1.ImageDisplayed então
imgedit1.RotateLeft;
fim;
procedimento Tscanf.N6Click(Remetente: TObject);
começar
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCut(selleft,seltop,selwidth,selheight);
fim;
procedimento Tscanf.N7Click(Remetente: TObject);
começar
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCopy(selleft,seltop,selwidth,selheight);
fim;
procedimento Tscanf.ImgEdit1SelectionRectDrawn(Sender: TObject; Esquerda,
Superior, Largura, Altura: Inteiro);
começar
se ((largura=0) e (altura=0))então
começar
n3.Ativado:=falso;
n6.Ativado:=falso;
n7.Ativado:=falso;
venderesquerda:=esquerda;
seltop:=topo;
selwidth:=largura;
selheight:=altura;
fim
senão começar
n6.Enabled:=true;
n7.Enabled:=true;
venderesquerda:=esquerda;
seltop:=topo;
selwidth:=largura;
selheight:=altura;
fim;
fim;
procedimento Tscanf.N11Click(Remetente: TObject);
começar
se não for imgedit1.IsClipboardDataAvailable então
se imgedit1.imagedisplayed então
imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height);
fim;
fim