JMF с использованием проблемы javax.imageio - PullRequest
0 голосов
/ 01 марта 2012

Я создал эту простую программу, которая использует JMF для захвата изображения с веб-камеры и сохранения его на локальном жестком диске с аргументами.Отлично работает при использовании com.sun.image.codec.jpeg.* от ecplipse.Но JDK7 больше не поддерживает это.Не может быть скомпилировано из командной строки.Вместо этого я должен использовать javax.imageio.Но я застрял здесь.Не могу закончить код.Я заменил com.sun.image.codec.jpeg на javax.imageio.

ImageIO.write(buffImg, "png", new File("c:\\byder_"+imagebydernr+".png")); 

при запуске из ecplipse выдает эту ошибку

"java.lang.NoSuchMethodError: main
Exception in thread "main" 

Не знаю, что делать.Нужно ли делать класс для imageIO?

package SwingCapture;


import javax.swing.*;
import java.io.*;
import java.util.Date;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.imageio.*;



public class SwingCapture extends Panel implements ActionListener 
{
 /**
 * 
 */
private static final long serialVersionUID = 1L;
public static Player player = null;
public CaptureDeviceInfo di = null;
public MediaLocator ml = null;
public JButton capture_take = null;
public JButton capture_accept = null;
public static Buffer buf = null;
public Image img = null;
public VideoFormat vf = null;
public BufferToImage btoi = null;
public ImagePanel imgpanel = null;
public BufferedImage buffImg = null;
public static String imagebydernr = null;



public SwingCapture() 
{
setLayout(new BorderLayout());
setSize(320,550);

imgpanel = new ImagePanel();
capture_take = new JButton("Take picture");
capture_accept = new JButton("Accept picture");
capture_take.addActionListener(this);
capture_accept.addActionListener(this);

String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";
di = CaptureDeviceManager.getDevice(str2);
ml = di.getLocator();


try 
{
  player = Manager.createRealizedPlayer(ml);
  player.start();
  Component comp;

  if ((comp = player.getVisualComponent()) != null)
  {
    add(comp,BorderLayout.NORTH);
  }
  add(capture_take,BorderLayout.CENTER);
  add(capture_accept,BorderLayout.EAST);
  add(imgpanel,BorderLayout.SOUTH);
} 
catch (Exception e) 
{
  e.printStackTrace();
}
 }



 public void main(String[] args) 
 {
Frame f = new Frame("C5snap");
SwingCapture cf = new SwingCapture();

imagebydernr = args[0];


f.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
  playerclose();
  System.exit(0);}});

f.add("Center",cf);
f.pack();
f.setSize(new Dimension(320,550));
f.setVisible(true);
}


public void playerclose() 
{
player.close();
player.deallocate();
 }


 public void actionPerformed(ActionEvent e) 
 {
JComponent c = (JComponent) e.getSource();

if (c == capture_take) 
{


     // Grab a frame from the capture device
    FrameGrabbingControl frameGrabber =                  (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl");
    Buffer buf = frameGrabber.grabFrame();


    // Convert frame to an buffered image so it can be processed and saved
    Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf));
    BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null),     BufferedImage.TYPE_INT_RGB);
    Graphics2D g = buffImg.createGraphics();
    g.drawImage(img, null, null);

    // Overlay current time on image
    g.setColor(Color.RED);
    g.setFont(new Font("Verdana", Font.BOLD, 16));
    g.drawString((new Date()).toString(), 10, 25);


 // Show picture
    imgpanel.setImage(img);



} else if (c == capture_accept) {

    File f = new File("c:\\byder_"+imagebydernr+".png");


    if(f.exists()){
          System.out.println("File existed");


          /* Warning box, if file exist.*/ 
          Object[] options = { "close" };
          int choice = JOptionPane.showOptionDialog(null, 
              "File exist. Close and call new picture", 
              "Advarsel", 
              JOptionPane.YES_NO_OPTION, 
              JOptionPane.QUESTION_MESSAGE, 
              null, 
              options, 
              options[0]);

          // Closing applet 
        if (choice == JOptionPane.YES_OPTION)
      {
        System.exit(0);
      }

     }else{
          System.out.println("File not found!");

           // Save image to disk as PNG
          ImageIO.write(buffImg, "png", new File("c:\\byder_"+imagebydernr+".png"));  

     }
    // Close webcam
    player.close();
    player.deallocate();
    System.exit(0);
    }    
 }


 class ImagePanel extends Panel 
 {
  /**
 * 
 */
private static final long serialVersionUID = 1L;
public Image myimg = null;

  public ImagePanel() 
 {
setLayout(null);
setSize(320,240);
 }

 public void setImage(Image img) 
 {
this.myimg = img;
repaint();
 }

  public void paint(Graphics g) 
 {
 if (myimg != null) 
 {
  g.drawImage(myimg, 0, 0, this);
}
}
}   

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Попробуйте ..

public static void main (строка [] args)

0 голосов
/ 08 марта 2012

Попробуйте:

public static void main(String[] args) 

и

public static void playerclose()

... тогда это должно работать.

...