uk.co.mmscomputing twain扫描仪

时间:2012-05-22 18:43:41

标签: java japplet twain image-scanner

我使用这个mmscomputing库作为java applet来扫描图像或文档。 使用摆动,我创建了一个扫描按钮,通过调用mmscomputing jar的scanner.acquire()方法获取扫描仪。

然后将扫描的图像放入jpanel进行显示。

问题是,我第一次启动我的applet并点击我的扫描按钮..扫描工作正常.Twain说它进入的是:3,4,5,6,7,5,4,3

然后第二次再次点击我的扫描按钮.. 吐温说它进入的是:3,4,5,4,3

它不会进入映像传输就绪和传输状态,因此不会进入下面的CODE IF循环

if(type.equals(ScannerIOMetadata.ACQUIRED))

所以我第二次无法将新的扫描图像看到我的jpanel ......

然后第三次,按下我的扫描按钮..再次它工作正常..进入所有状态。 所以我的意思是,为了交替转动或重新启动java applet ..它的工作原理。 会是什么问题..?

我想,每当我点击扫描按钮时,它应该让我在Jpanel中获得一个新图像..但它正在做其他时间。 我可以强行明确地设置或改变两个州进入第六和第七州。 或者是否有一些twain源初始化问题第二次出现? 因为重启applet每次都很好..或者某种方式每次点击扫描按钮重新初始化applet对象..因为我觉得每次点击扫描按钮都会重新启动applet ...

我没有得到它..

以下是示例代码:

import uk.co.mmscomputing.device.twain.TwainConstants;
import uk.co.mmscomputing.device.twain.TwainIOMetadata;
import uk.co.mmscomputing.device.twain.TwainSource; 
import uk.co.mmscomputing.device.twain.TwainSourceManager;


public class XXCrop extends JApplet implements PlugIn, ScannerListener 
{

    private JToolBar jtoolbar = new JToolBar("Toolbar", JToolBar.HORIZONTAL);
    ImagePanel ipanel;
    Image im =null;
    BufferedImage imageforCrop;
    ImagePlus imp=null;
    int imageWidth;
    int imageHeight;
    private static final long serialVersionUID = 1L;
    Container   content = null;
    private JPanel jContentPane = null;
    private JButton jButton = null;
    private JButton jButton1 = null;
    JCheckBox clipBox = null;
    JPanel crpdpanel=null;
     JPanel cpanel=null;
    private Scanner scanner=null;
    private  TwainSource ts ;
    private boolean       is20;






    ImagePanel imagePanel,imagePanel2 ;




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

    public void run(String arg0) {

        new XXCrop().setVisible(false);
        repaint();
    }

    /**
     * This is the default constructor
     */
    public XXCrop() {
        super();
        init();
        try {
            scanner = Scanner.getDevice();

            if(scanner!=null)
            {
            scanner.addListener(this);
            }

        } catch (Exception e) 
        {
            e.printStackTrace();
        }


    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    public void init() 
    {
        this.setSize(1200, 600);
        this.setLayout(null);
        //this.revalidate();
        this.setContentPane(getJContentPane());
    }



    private JToolBar getJToolBar() 
    {
        jtoolbar.add(getJButton1());
        jtoolbar.add(getJButton());


        jtoolbar.setName("My Toolbar");   
        jtoolbar.addSeparator();
        Rectangle r=new Rectangle(0, 0,1024, 30 );
        jtoolbar.setBounds(r);
        return jtoolbar;
    }

    private JPanel getJContentPane() 
    {
        if (jContentPane == null) 
        {
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getJToolBar());
        }
        return jContentPane;
    }


    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;
    }


    /* Select the twain source! */
    public void selectDevice() {

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

    }

    private JButton getJButton1() 
    {
        if (jButton1 == null) {
            jButton1 = new JButton();
            jButton1.setBounds(new Rectangle(35,0, 30, 30));
            jButton1.setText("Scan");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) 
                {//jContentPane.remove(crpdpanel);
                    //jContentPane.removeAll();
                //jContentPane.repaint();
                //jContentPane.revalidate();

                    getScan();
                }
            });
        }
        return jButton1;
    }

    public void getScan() 
    {

        try 
        {   


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


     public Image getImage()
     { 
         Image image = imp.getImage();
         return image;
     }


     /*Image cimg;

     public Image getCimg()
        { 
            return cimg;
        }*/

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



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

            //imagePanel.revalidate();
            //imagePanel.repaint();
            //imagePanel.invalidate();

            //jContentPane.remove(ipanel);
            //ipanel.repaint();


    if(imp!=null)
    {
        jContentPane.remove(ipanel);
        jContentPane.remove(cpanel);
        jContentPane.remove(crpdpanel);
    }


             imp = new ImagePlus("Scan", metadata.getImage());
             //imp.show();
             im = imp.getImage();


             //imagePanel = new ImagePanel(im,imageWidth,imageHeight);
             imagePanel = new ImagePanel(im);
             imagePanel.updateUI();

             imagePanel.repaint();
             imagePanel.revalidate();

             ClipMover mover = new ClipMover(imagePanel);
             imagePanel.addMouseListener(mover);
             imagePanel.addMouseMotionListener(mover);

              ipanel = imagePanel.getPanel();

             ipanel.setBorder(new LineBorder(Color.blue,1));
             ipanel.setBorder(BorderFactory.createTitledBorder("Scanned Image"));
             ipanel.setBounds(0, 30,600, 600);
             ipanel.repaint();
             ipanel.revalidate();
             ipanel.updateUI();
             jContentPane.add(ipanel);
             jContentPane.getRootPane().revalidate();
             jContentPane.updateUI();
             //jContentPane.repaint();

            // cimg=imagePanel.getCimg();

            // ImagePanel cpanel = (ImagePanel) imagePanel.getUIPanel();
             /*
             cpanel.setBounds(700, 30,600, 800);
             jContentPane.add(imagePanel.getUIPanel());
             */
              cpanel = imagePanel.getUIPanel();
             cpanel.setBounds(700, 30,300, 150);
             cpanel.repaint();
             cpanel.setBorder(new LineBorder(Color.blue,1));
             cpanel.setBorder(BorderFactory.createTitledBorder("Cropping Image"));
             jContentPane.add(cpanel);


             jContentPane.repaint();
             jContentPane.revalidate();




            metadata.setImage(null);
            try {
                new uk.co.mmscomputing.concurrent.Semaphore(0, true).tryAcquire(2000, null);
            } catch (InterruptedException e) {
                IJ.error(e.getMessage());

            }

        } 




        else if (type.equals(ScannerIOMetadata.NEGOTIATE)) {
            ScannerDevice device = metadata.getDevice();
            try {
                device.setResolution(100);
            } catch (ScannerIOException e) {
                IJ.error(e.getMessage());
            }

              try{
              device.setShowUserInterface(false);
            // 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)) {
            System.out.println("Scanner State "+metadata.getStateStr());
            System.out.println("Scanner State "+metadata.getState());
            //switch (metadata.ACQUIRED){};
            ts = ((TwainIOMetadata)metadata).getSource();
        //ts.setCancel(false);
            //ts.getState()
            //TwainConstants.STATE_TRANSFERREADY
             ((TwainIOMetadata)metadata).setState(6);
            if ((metadata.getLastState() == 3) && (metadata.getState() == 4)){} 
            // IJ.error(metadata.getStateStr());
        } 

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


    }


     public void stop(){                                                    // execute before System.exit
            if(scanner!=null){                                                   // make sure user waits for scanner to finish!
                 scanner.waitToExit();

                    ts.setCancel(true);

                    try {
                        scanner.setCancel(true);
                    } catch (ScannerIOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }
          }

1 个答案:

答案 0 :(得分:3)

我不是专家,但是ScannerIOMetadata.STATECHANGE不应该检查扫描是否完整?

如果是,您应该再次初始化扫描仪。

类似的东西:

if (metadata.isFinished())
{
   twainScanner = (TwainScanner) Scanner.getDevice();
}