这是一个用Java来操作扫描仪的小例子:
package edu.ctgu.JTwacker;
import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream;
import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import javax.swing.SwingUtilities;
import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder;
import edu.ctgu.twain.JTwain; /* 这是显示扫描图片的frame */ public class JTwacker extends JFrame {
class JPEGPanel extends JPanel {
/** Image for the inner class */ protected BufferedImage mJPEGPanelBufferedImage;
/** Pnale to diaply the image */ public JPEGPanel() { // no op }
/** Sets the bufferedimage into the class * @param bi BufferedImage */ public void setBufferedImage(BufferedImage bi) { if (bi == null) { return; } mJPEGPanelBufferedImage = bi; Dimension d = new Dimension(mJPEGPanelBufferedImage.getWidth(this), mJPEGPanelBufferedImage.getHeight(this)); setPreferredSize(d); revalidate(); repaint(); }
/** Paints the component. * @param g Graphics object used for the painting */ public void paintComponent(Graphics g) { super.paintComponent(g); Dimension d = getSize(); g.setColor(getBackground()); g.fillRect(0, 0, d.width, d.height); if (mJPEGPanelBufferedImage != null) { g.drawImage(mJPEGPanelBufferedImage, 0, 0, this); } } }
protected JPEGPanel mJpegPanel;
protected BufferedImage mBufferedImage;
protected JComboBox mSourcesCombo;
protected JToolBar mToolBar;
/** ConstrUCtor */ public JTwacker() { super("测试");
mJpegPanel = new JPEGPanel(); JScrollPane ps = new JScrollPane(mJpegPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); getContentPane().add(ps, BorderLayout.CENTER);
WindowListener wndCloser = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(wndCloser);
mToolBar = new JToolBar("Twain"); mToolBar.setFloatable(false); addButtons(); getContentPane().add(mToolBar, BorderLayout.NORTH); setSize(800, 600);
/* Center the frame */ Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle frameDim = getBounds(); setLocation( (screenDim.width - frameDim.width) / 2, (screenDim.height - frameDim.height) / 2 ); setVisible(true); }
protected void addButtons(){
JButton _ab = new JButton("扫描"); _ab.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { acquireImage(); } }); mToolBar.add(_ab); mToolBar.addSeparator();
if (edu.ctgu.twain.JTwain.getInstance().isTwainAvailble()) { String[] twainSources = JTwain.getInstance().getAvailableSources(); if (twainSources != null) { mSourcesCombo = new JComboBox(twainSources); } else { mSourcesCombo = new JComboBox(); mSourcesCombo.addItem("<NONE AVAILABLE>"); } } else { mSourcesCombo = new JComboBox(); mSourcesCombo.addItem("<NONE AVAILABLE>"); } mToolBar.add(mSourcesCombo); }
protected void acquireImage() { if (JTwain.getInstance().isTwainAvailble()){ if (mSourcesCombo.getItemCount() > 0 ){ String _source = (String)mSourcesCombo.getSelectedItem(); if (_source != null){ String _filename = JTwain.getInstance().acquire(_source); System.out.println(_filename);
if (_filename != null && _filename.length() > 0) { File fChoosen = new File(_filename); // savetofile(fChoosen); showImage(fChoosen); } else { System.out.println("哎呀,怎么出错了!"); } } // end if } // end if } // end if }
protected void showImage(final File file) { if (file == null !file.exists()) { return; } setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Thread runner = new Thread() { public void run() { try { FileInputStream in = new FileInputStream(file); JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in); mBufferedImage = decoder.decodeAsBufferedImage(); in.close(); SwingUtilities.invokeLater( new Runnable() { public void run() { reset(); } }); } catch (Exception ex) { ex.printStackTrace(); } setCursor(Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR)); } }; runner.start(); }
//把扫描得到的图片保存为文件,然后上传到服务器或保存到数据库中 protected void savetofile(final File file) { try { File mfile=new File("c:\\dd.jpg"); if (mfile.exists()) { mfile.delete(); }else { file.renameTo(mfile); }
} catch (Exception e) { e.printStackTrace(); // TODO: handle exception } }
protected void reset() { if (mBufferedImage != null) { mJpegPanel.setBufferedImage(mBufferedImage);
} }
public static void main(String argv[]) { new JTwacker(); }
}
-------------------------
package edu.ctgu.twain;
/* 这是调用动态链接库的类 */ public class JTwain {
private static final JTwain mInstance = new JTwain(); protected final String DLL_NAME = "jtwain";
private JTwain() { initLib(); }
public static JTwain getInstance(){ return mInstance; }
public native boolean isTwainAvailble();
public native String[] getAvailableSources();
public native String acquire();
public native String acquire(String sourceName);
private void initLib(){
try {
System.loadLibrary(DLL_NAME); }catch(Exception e) { e.printStackTrace(); }
finally { // System.out.println("Loading : " + DLL_NAME + ".dll"); } } }
实现jtwain.dll的文件
|