Код: Выделить всё
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.ImageConsumer;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JApplet;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.filechooser.FileFilter;
import SK.gnome.morena.Morena;
import SK.gnome.morena.MorenaImage;
import SK.gnome.morena.MorenaSource;
import SK.gnome.twain.TwainSource;
import SK.gnome.twain.TwainSource.Frame;
public class ScannerApp extends JApplet
{ private static class MainPanel extends JPanel
{ private JTextField status = new JTextField();
private ImagePanel selected=null;
private SaveImageAction saveImageAction;
private UploadImageAction uploadImageAction;
private MouseListener mouseListener=new MouseListener();
private boolean hasServer=false;
private URL documentBase=null;
private class RemoveAllAction extends AbstractAction implements Runnable
{ RemoveAllAction()
{ super("remove all");
}
public synchronized void actionPerformed(ActionEvent event)
{ new Thread(this).start();
}
public synchronized void run()
{ removeAll();
select(null);
repaint();
}
}
private class AcquireImageAction extends AbstractAction implements Runnable
{ AcquireImageAction()
{ super("acquire image");
}
public synchronized void actionPerformed(ActionEvent event)
{ new Thread(this).start();
}
public synchronized void run()
{ try
{ status.setText("Working ...");
MorenaSource source=Morena.selectSource(MainPanel.this);
if (source!=null)
{ source.setColorMode();
source.setResolution(100);
while (true)
{ MorenaImage morenaImage=new MorenaImage(source);
int imageStatus=morenaImage.getStatus();
if (imageStatus==ImageConsumer.STATICIMAGEDONE)
{ int imageWidth=morenaImage.getWidth();
int imageHeight=morenaImage.getHeight();
int imagePixelSize=morenaImage.getPixelSize();
ImagePanel image=new ImagePanel(Toolkit.getDefaultToolkit().createImage(morenaImage));
MainPanel.this.add(image);
select(image);
int size=(int)Math.round(Math.sqrt(getComponentCount()));
setLayout(new GridLayout(size, size));
if (TwainSource.class.isInstance(source))
{
Frame frame=((TwainSource)source).getFrame();
status.setText("Done - actual image frame is ["+Math.round(100*frame.left)/100.0+", "+Math.round(100*frame.top)/100.0+"] - ["+Math.round(100*frame.right)/100.0+", "+Math.round(100*frame.bottom)/100.0+"] ...");
}
else
status.setText("Done - actual image size is "+imageWidth+" x "+imageHeight+" x "+imagePixelSize+" ...");
validate();
if (TwainSource.class.isInstance(source) && ((TwainSource)source).hasMoreImages())
continue;
}
else if (imageStatus==ImageConsumer.IMAGEABORTED)
status.setText("Aborted, try again ...");
else if (imageStatus==ImageConsumer.IMAGEERROR)
status.setText("Failed, try again ...");
break;
}
}
else
status.setText("Failed, try again ...");
}
catch (NoSuchMethodError error)
{ JOptionPane.showMessageDialog(MainPanel.this, "Previous version of Morena is installed in "+System.getProperty("java.home")+".\nYou have to remove it first.\nClick OK to terminate browser.", "Error", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
catch (Throwable exception)
{ JOptionPane.showMessageDialog(MainPanel.this, exception.toString(), "Error", JOptionPane.ERROR_MESSAGE);
exception.printStackTrace();
status.setText("Failed, try again ...");
}
finally
{ try
{ Morena.close();
}
catch (Exception exception)
{ exception.printStackTrace();
}
}
}
}
private class SaveImageAction extends AbstractAction implements Runnable
{ private class Filter extends FileFilter
{ String type;
Filter(String type)
{ this.type=type;
}
public boolean accept(File file)
{ return file.getName().endsWith(type);
}
public String getDescription()
{ return type+" Files";
}
}
SaveImageAction()
{ super("save to file");
}
public void actionPerformed(ActionEvent event)
{ new Thread(this).start();
}
public synchronized void run()
{ try
{ status.setText("Working ...");
Image image=selected.getImage();
BufferedImage bufferedImage=new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
bufferedImage.createGraphics().drawImage(image, 0, 0, null);
JFileChooser chooser=new JFileChooser();
// Java 1.6 introduced a comfortable ImageIO.getWriterFileSuffixes() method.
String e[] = ImageIO.getWriterFormatNames();
for (int i=0; i1024*1024)
throw new Exception("Image is too big to upload");
URL uploadURL=new URL(documentBase, "upload.php");
HttpURLConnection connection=(HttpURLConnection)uploadURL.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setDefaultUseCaches(false);
connection.setRequestProperty("content-type", "img/jpeg");
connection.setRequestProperty("content-length", String.valueOf(contentLength));
OutputStream out=connection.getOutputStream();
out.write(tmp.toByteArray());
out.close();
InputStream in=connection.getInputStream();
int c;
while ((c=in.read())!=-1)
System.err.write(c);
in.close();
URL imageURL=new URL(documentBase, connection.getHeaderField("file-name"));
status.setText("Done - image is uploaded to "+imageURL+" (for at least 5 minutes) ...");
}
catch (Throwable exception)
{ JOptionPane.showMessageDialog(MainPanel.this, exception.toString(), "Error", JOptionPane.ERROR_MESSAGE);
exception.printStackTrace();
status.setText("Failed, try again ...");
}
}
public boolean isEnabled()
{ return hasServer && selected != null;
}
}
private class MouseListener extends MouseAdapter
{ public void mouseClicked(MouseEvent event)
{ select((ImagePanel)event.getComponent());
}
}
private class ImagePanel extends JPanel
{ private Image image;
int imageWidth;
int imageHeight;
ImagePanel(Image image)
{ this.image=image;
imageWidth=image.getWidth(null);
imageHeight=image.getHeight(null);
addMouseListener(mouseListener);
}
public Image getImage()
{ return image;
}
public void paint(Graphics g)
{ super.paint(g);
int panelWidth=getWidth()-6;
int panelHeight=getHeight()-6;
double horizontalRatio=(double)panelWidth/imageWidth;
double verticalRatio=(double)panelHeight/imageHeight;
if (horizontalRatio>verticalRatio)
g.drawImage(image, (int)(panelWidth-imageWidth*verticalRatio)/2+3, 3, (int)(imageWidth*verticalRatio), (int)(imageHeight*verticalRatio), this);
else
g.drawImage(image, 3, 3, (int)(imageWidth*horizontalRatio), (int)(imageHeight*horizontalRatio), this);
}
}
private class ToolBar extends JToolBar
{ ToolBar()
{ add(new RemoveAllAction());
addSeparator();
add(new AcquireImageAction());
addSeparator();
add(saveImageAction=new SaveImageAction());
saveImageAction.setEnabled(false);
addSeparator();
add(uploadImageAction=new UploadImageAction());
uploadImageAction.setEnabled(false);
setMargin(new Insets(4, 2, 2, 2));
}
}
private class StatusBar extends JToolBar
{ StatusBar()
{ add(status);
status.setText("Ready ...");
}
}
void select(ImagePanel image)
{ if(selected != null)
selected.setBorder(null);
selected = image;
if(selected != null)
{
selected.setBorder(new LineBorder(Color.blue, 1));
saveImageAction.setEnabled(true);
uploadImageAction.setEnabled(hasServer);
} else
{
saveImageAction.setEnabled(false);
uploadImageAction.setEnabled(false);
}
}
MainPanel(Container container, URL documentBase)
{ this.documentBase=documentBase;
status.setEditable(false);
hasServer=documentBase!=null && documentBase.getProtocol().indexOf("http")!=-1;
container.add(new ToolBar(), BorderLayout.NORTH);
container.add(this, BorderLayout.CENTER);
container.add(status, BorderLayout.SOUTH);
setLayout(new GridLayout(1, 1));
}
}
public void init()
{ new MainPanel(getContentPane(), getDocumentBase());
}
public static void main(String args[])
{ JFrame frame=new JFrame("Morena Studio");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
new MainPanel(frame.getContentPane(), null);
frame.setBounds(100, 100, 600, 400);
frame.setVisible(true);
}
}
Морена: https://www. gnome.sk/Morena/morena.html
Ejemplos
Я пробовал множество реализаций, таких как уже упомянутые, WIA, TWAIN, SANE, и ни одна из них не помогла мне решить эту проблему. бесплатно и с принтерами, подключенными по сети
Подробнее здесь: https://stackoverflow.com/questions/790 ... -with-java