首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > JAVA专栏 > 正文
  • 在Java中操作扫描仪(使用JNI)
      2007-3-14  来源:网络资源  编辑:Jsbulo  热度:

    这是一个用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的文件