Twain em java (Digitalização)

Bom dia pessoal!

Estou precisando que o Scanner se comunique com minha aplicação, para isso estou querendo trabalhar com o Driver Twain.
mas ainda não consegui sair do lugar.
Alguém conhece alguma documentação em Java ou alguma jar para trabalhar com esse driver?

Qualquer dica vale ouro!

Estou precisando muito.

Obrigado

Olá Bom dia.

Qualquer mesmo???

dias atras eu respondi a uma questão aqui

http://www.guj.com.br/java/299661-como-captuar-imagem-de-uma-camera-conectada-via-usb-qual–api-usar-#1592118

Meu projeto que utiliza digitalização tá meio parado porque é em Web e eu tenciono fazer um modulo em Swing só para a captura, eu tenho a mmscomputing mais não estou conseguindo digitalizar com ela, ja com a Morena eu consegui, não sei te dizer se a mmscomputing esta com algum problema.

rlira,

Meu projeto também é web, mas nesse caso vou criar um serviço desktop que será instalado apenas nas maquinas que irão digitalizar e via ODBC fará conexão no mesmo bando do restante da aplicação web;

Essa jar gratuita, é so importar e trabalhar com os metodos? Funciona?

Vou dar uma olhada nas duas! Obrigado!

Mais uma dúvida.

Consegui o código que faz o “scaneamento” Até ai ta beleza.

Preciso de uma ajuda na hora de salvar esse arquivo que é uma imagem em uma pasta já parametrizada


public class Scan_ extends JFrame implements PlugIn, ScannerListener {


.
.
.
.
Várias outras loucuragens
.
.
.
.
.


	public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) {

		if (type.equals(ScannerIOMetadata.ACQUIRED)) {

			ImagePlus imp = new ImagePlus("Scan", metadata.getImage());
			imp.show();
			/* inicio alteração teste */
			File arquivo = new File("C:\\scan.tif");
			FileSaver salvador = new FileSaver(imp);
			salvador.saveAsTiff(arquivo.getName());
			/* fim alteração teste */

Ele está me exibindo a imagem “imp.show” normalmente
Mas não salva na pasta.
heeeeelp

Olá CoringadoBatman??? bom dia, tudo bem meu caro?

Então… acho que vc esta utilizando a biblioteca mmscomputing.

o que o metodo getImage te retorna é um BufferedImage então vc pode fazer assim

      BufferedImage image=metadata.getImage();

      try{

         FileOutputStream outputStream = new FileOutputStream(sArquivo);

        ImageIO.write(image, "JPEG", outputStream);

        outputStream.close();

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

Fala rlira!
Estou usando mmscomputing sim, gratuita e open source! :wink:
Muito boa sua resposta… a partir do que você disse sobre buffer consegui salvar na extensão que precisava!

Mas, como nem tudo são flores. Ainda estou esbarrando em uma parte.
Preciso agora salvar várias imagens de uma vez só. Ou seja.
A pessoa vai colocar 10 folhas no Scanner e devo scannear e salvar as 10.
Fiz um “com 4 ocorrencias” apenas para teste.

Se alguém puder me dar mais essa mãozinha?!?!?!

Mesmo assim, segue abaixo toda minha classe.
Se alguém precisar scanear pode ser útil, e como sempre me ajudam aqui no forum me sinto no deve de tentar ajudar também!
:wink:

Lembrando: classe a baixo em POG!!

import ij.IJ;
import ij.ImagePlus;
import ij.io.FileSaver;
import ij.plugin.PlugIn;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Calendar;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.GregorianCalendar;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerDevice;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;
import uk.co.mmscomputing.device.scanner.ScannerListener;
import javax.swing.WindowConstants;

public class Scan_ extends JFrame implements PlugIn, ScannerListener {

	// Sem essa linha do "serialVersionUID" não funciona, não entendi pq
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JButton jButton = null;
	private JButton jButton1 = null;
	private Scanner scanner;

	public static void main(String[] args) {
		new Scan_().setVisible(true);
	}

	public void run(String arg0) {

		new Scan_().setVisible(true);
	}

	/**
	 * Constructor
	 */
	public Scan_() {
		super();
		initialize();
		try {
			scanner = Scanner.getDevice();
			scanner.addListener(this);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void initialize() {
		this.setSize(300, 120);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setResizable(false);
		this.setContentPane(getJContentPane());
		this.setTitle("Scan");
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {

			}
		});
	}

	/**
	 * Esse metodo inicializa o jContentPane
	 * 
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJButton(), null);
			jContentPane.add(getJButton1(), null);
		}
		return jContentPane;
	}

	/**
	 * Esse metodo inicializa o jButton
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(4, 16, 131, 42));
			jButton.setText("Select Device");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if (scanner.isBusy() == false) {
						selectDevice();
					}

				}
			});
		}
		return jButton;
	}

	/**
	 * Esse metodo inicializa o jButton1
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setBounds(new Rectangle(160, 16, 131, 42));
			jButton1.setText("Scan");
			jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {

					getScan();

				}
			});
		}
		return jButton1;
	}

	/* Selecionando o device */
	public void selectDevice() {

		try {
			scanner.select();
		} catch (ScannerIOException e1) {
			IJ.error(e1.toString());
		}

	}

	/* Scaneando */
	public void getScan() {

		try {
			scanner.acquire();
		} catch (ScannerIOException e1) {
			IJ.showMessage("Access denied! \nTwain dialog maybe already opened!");
			// e1.printStackTrace();

		}

	}

	public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) {

		Calendar tempo = Calendar.getInstance();
		int segundo = tempo.get(Calendar.SECOND);
		
		
		if (type.equals(ScannerIOMetadata.ACQUIRED)) {
			int QtdImagens = 4;
			for (int i = 1; i < QtdImagens; i++) {
				ImagePlus imp = new ImagePlus("Scan", metadata.getImage());
				imp.show();
				/* inicio alteração teste */
				File arquivo = new File("C:/Temp/scan" + segundo + ".tif");
				FileSaver salvador = new FileSaver(imp);
				salvador.saveAsTiff(arquivo.getAbsolutePath());
			}
			
			//			File arquivo = new File("C:/Temp/scan.tif");
//			FileSaver salvador = new FileSaver(imp);
//			salvador.saveAsTiff(arquivo.getAbsolutePath());
			/* fim alteração teste */
			metadata.setImage(null);
			try {
				new uk.co.mmscomputing.concurrent.Semaphore(0, true).tryAcquire(2000, null);
			} catch (InterruptedException e) {
				IJ.error(e.getMessage());
				// e.printStackTrace();
			}

		} else if (type.equals(ScannerIOMetadata.NEGOTIATE)) {
			ScannerDevice device = metadata.getDevice();
			try {
				device.setResolution(100);
			} catch (ScannerIOException e) {
				IJ.error(e.getMessage());
			}
			/*
			 * More options if necessary! try{
			 * device.setShowUserInterface(true);
			 * device.setShowProgressBar(true);
			 * device.setRegionOfInterest(0,0,210.0,300.0);
			 * device.setResolution(100); }catch(Exception e){
			 * e.printStackTrace(); }
			 */
		} else if (type.equals(ScannerIOMetadata.STATECHANGE)) {

			// IJ.error(metadata.getStateStr());
		} else if (type.equals(ScannerIOMetadata.EXCEPTION)) {
			IJ.error(metadata.getException().toString());

		}

	}

} // @jve:decl-index=0:visual-constraint="95,130"

Correto meu caro, existem os scanner´s especificos para aplicações mais profissionais os quais vc coloca meio meio mundo de paginas e ele sai digitalizando tudo… neste caso vc realmente tem que alterar sua aplicação fazer um loop enquanto existir ( digamos assim buffer ) eu não testei isto mais acredito que vc possa ir salvando cada documento em uma pasta tmp e ao final qdo não mais existir nada a digitalizar pegar o conteudo dos arquivos e formar um arquivo só… eu estava pensando nisto porque eu converto para pdf então geraria um unico pdf limparia a pasta tmp deixando-a pronta para uma nova sessão de digitalização.

o lance então é um loop, vou ver aqui se consigo algo mais… fisico que possa te enviar.

mais algo do tipo…
while scanner.acquire() {

}

Sim, se eu conseguir salvar todos os arquivos em uma pasta fica showw!

Ja tenho uma rotina que varre a pasta, pega os arquivos TIF singlepage e transforma para PDFmultipage.

Vou tentar fazer algo com esse “while” da sua dica!

Mais uma vez obrigado

Ola, estou tentando utilizar o exemplo porem me retorna um erro acredito que não esta localizando o jtwain.dll poderia me ajudar?

[quote=CoringadoBatman]Sim, se eu conseguir salvar todos os arquivos em uma pasta fica showw!

Ja tenho uma rotina que varre a pasta, pega os arquivos TIF singlepage e transforma para PDFmultipage.

Vou tentar fazer algo com esse “while” da sua dica!

Mais uma vez obrigado[/quote]