Reputation: 29
I have the following code to scan an image in Java 7, using the Morena library. My code is as follows:
import SK.gnome.morena.*;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ScannerMorena {
public static void main(String[] args) {
try {
// Seleccionar la fuente de escaneo (dispositivo de red
o USB)
MorenaSource source = Morena.selectSource(null); // Mostrar cuadro de diálogo con dispositivos
if (source != null) {
System.out.println("Fuente seleccionada: " + source.toString());
// Configurar el modo de color y la resolución
//source.setColorMode(); // Modo de color predeterminado
//source.setResolution(100); // Resolución a 100 DPI
// Obtener la imagen escaneada
MorenaImage morenaImage = new MorenaImage(source);
// Convertir la imagen escaneada a formato de Image de Java
Image scannedImage = Toolkit.getDefaultToolkit().createImage(morenaImage);
// Mostrar la imagen en una ventana gráfica
showImage(scannedImage, "Imagen escaneada de red");
// Cerrar la fuente
Morena.close();
} else {
System.out.println("No se seleccionó ningún dispositivo.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Método para mostrar la imagen en un JFrame
public static void showImage(Image image, String title) {
JFrame frame = new JFrame(title);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Convertir Image a ImageIcon y agregarla a un JLabel
JLabel label = new JLabel(new ImageIcon(image));
// Agregar el JLabel al JFrame
frame.getContentPane().add(label);
frame.pack(); // Ajustar tamaño del frame al contenido
frame.setVisible(true);
}
}
With this program, the printer scan works correctly, and there are no interruptions in the process. But when I try to scan using another library called mmscomputing, the scanning process stops when the scan starts.
My code with mmscomputing library:
package MorenaExample;
import uk.co.mmscomputing.device.scanner.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JComponent;
public class ScannerManager implements ScannerListener {
private Scanner scanner;
private boolean isScanning = false;
private String lastError = null;
private BufferedImage lastScannedImage = null;
private String scannerName;
public ScannerManager() {
initializeScanner();
}
private void initializeScanner() {
try {
scanner = Scanner.getDevice();
if (scanner != null) {
scanner.addListener(this);
} else {
lastError = "No se pudo inicializar el escáner. Verifique que esté conectado y los drivers instalados.";
}
} catch (Exception e) {
lastError = "Error al inicializar el escáner: " + e.getMessage();
}
}
//Devolver dispositivos de escaneres en la pc
public String[] listDevices() {
String[] scannersList = null;
try {
//Deberia poder mostrar los escaneres en una lista de escaneres
scannersList = scanner.getDeviceNames();
}catch (ScannerIOException e) {
// TODO: handle exception
System.out.println("Error a la hora listar dipositivos");
}
return scannersList;
}
public boolean isInitialized() {
return scanner != null;
}
public String getLastError() {
return lastError;
}
public BufferedImage getLastScannedImage() {
return lastScannedImage;
}
public String[] getAvailableScanners() {
try {
return scanner.getDeviceNames();
} catch (ScannerIOException e) {
lastError = "Error al obtener la lista de escáneres: " + e.getMessage();
return new String[0];
}
}
public boolean selectScanner(String scannerName) {
try {
scanner.select(scannerName);
return true;
} catch (ScannerIOException e) {
lastError = "Error al seleccionar el escáner: " + e.getMessage();
return false;
}
}
public String getCurrentScanner() {
try {
return scanner.getSelectedDeviceName();
} catch (ScannerIOException e) {
lastError = "Error al obtener el nombre del escáner actual: " + e.getMessage();
return null;
}
}
public boolean startScan() {
if (isScanning) {
return false;
}
try {
System.out.println("-----> El escaner es:" + scanner.getDevice());
scanner.acquire();
isScanning = true;
return true;
} catch (ScannerIOException e) {
lastError = "Error al iniciar el escaneo: " + e.getMessage();
return false;
}
}
public void cancelScan() {
try {
scanner.setCancel(true);
} catch (ScannerIOException e) {
lastError = "Error al cancelar el escaneo: " + e.getMessage();
}
}
public JComponent getScannerUI() {
try {
return scanner.getScanGUI();
} catch (ScannerIOException e) {
lastError = "Error al obtener la interfaz del escáner: " + e.getMessage();
return null;
}
}
@Override
public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) {
System.out.println("HOLA");
System.out.println("Estado del escáner: " + type + type.toString());
if (type.equals(ScannerIOMetadata.ACQUIRED)) {
lastScannedImage = metadata.getImage();
System.out.println("Imagen adquirida correctamente.");
isScanning = false;
} else if (type.equals(ScannerIOMetadata.FILE)) {
File file = metadata.getFile();
System.out.println("Imagen guardada en: " + file.getAbsolutePath());
} else if (type.equals(ScannerIOMetadata.NEGOTIATE) && metadata.getDevice() != null) {
try {
metadata.getDevice().setResolution(150.0); // Resolución en DPI
//metadata.getDevice().setRegion(0, 0, 100, 100); // Configura el área de escaneo si es aplicable
} catch (ScannerIOException e) {
e.printStackTrace();
}
} else if (type.equals(ScannerIOMetadata.STATECHANGE)) {
String state = metadata.getStateStr();
System.out.println("Cambio de estado del escáner: " + state);
if (state.contains("Connection Lost")) {
System.out.println("La conexión con el escáner se ha perdido.");
isScanning = false;
// Aquí puedes intentar reconectar o dar alguna notificación al usuario
}
} else if (type.equals(ScannerIOMetadata.EXCEPTION)) {
lastError = metadata.getException().getMessage();
System.out.println("Error durante el escaneo: " + lastError);
isScanning = false;
}
// Añadir una pausa de 500 ms entre cada cambio de estado
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("La pausa fue interrumpida: " + e.getMessage());
}
}
public void close() {
if (scanner != null) {
scanner.waitToExit();
}
}
}
My GUI:
package ScannerPruebaGUI;
import java.awt.EventQueue;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import MorenaExample.ScannerManager;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
public class UILibrary extends JFrame {
private JPanel contentPane;
private JList<String> listShowScanners;
private String selectedScanner; // Variable para almacenar el escáner seleccionado
private ScannerManager gestorScanner;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UILibrary frame = new UILibrary();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public UILibrary() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
listShowScanners = new JList<>();
listShowScanners.setBounds(50, 50, 200, 150);
contentPane.add(listShowScanners);
// Listener para guardar el escáner seleccionado
listShowScanners.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) { // Asegurarse de que se haya terminado la selección
selectedScanner = listShowScanners.getSelectedValue(); // Guardar el escáner seleccionado
//System.out.println("Escáner seleccionado: " + selectedScanner);
try {
//Acceder al escaner que se selecciono
gestorScanner.selectScanner(selectedScanner);
boolean escanning = gestorScanner.startScan();
gestorScanner.close();
}catch (Exception f) {
// TODO: handle exception
System.out.println("Error en el proceso de escaneo" + f.getMessage());
}
//getSelectedScanner();
}
}
});
loadScannersList(); // Llenar la lista de escáneres disponibles
}
private void loadScannersList() {
gestorScanner = new ScannerManager();
String[] misEscaneres = gestorScanner.listDevices();
if (misEscaneres != null && misEscaneres.length > 0) {
DefaultListModel<String> model = new DefaultListModel<>();
for (String scannerName : misEscaneres) {
model.addElement(scannerName);
}
listShowScanners.setModel(model);
} else {
System.out.println("No se encontraron escáneres.");
}
}
// Método para acceder al nombre del escáner seleccionado desde otra parte de la clase
public void getSelectedScanner() {
//Aca tengo en selectScanner el nombre, por lo que de la clase ScannerManager podria seleccionarlo
boolean seleccion = gestorScanner.selectScanner(selectedScanner);
System.out.println("El escaner seleccionado es: " + selectedScanner + " ,se selecciono con exito: " + seleccion);
}
}
I have already read all the documentation and tested a few projects, but nothing works for me.
I want to scan an image from printer scanner with java 7, I have some scanners connected with red or resources shares, and i want my program to be able to do that.
Upvotes: 0
Views: 37