3

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

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

问题是,当我第一次启动我的小程序并点击我的扫描按钮时..扫描工作正常..它进入的吐温状态是:3,4,5,6,7,5,4,3

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

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

if (type.equals(ScannerIOMetadata.ACQUIRED))

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

然后第三次,点击我的扫描按钮..再次正常工作..进入所有状态。所以我的意思是,对于交替打开或重新启动java小程序..它可以工作。会有什么问题..?

我想,每次当我点击扫描按钮时,它都应该让我在 Jpanel 中获得一个新图像。但它正在做替代时间。我可以强制显式设置或更改 twain 状态以进入第 6 和第 7 状态.. 还是第二次出现一些 twain 源初始化问题?因为每次重新启动小程序都很好..或者每次单击扫描按钮时都可以通过某种方式重新初始化小程序对象..因为每次单击扫描按钮时我都会重新启动小程序...

我不明白。。

下面是示例代码:

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();
                    }
            }
          }
4

1 回答 1

3

我不是专家,但你什么时候ScannerIOMetadata.STATECHANGE不应该检查扫描是否完成?

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

像这样的东西:

if (metadata.isFinished())
{
   twainScanner = (TwainScanner) Scanner.getDevice();
}
于 2012-11-07T11:27:23.213 回答