📄 webcamswing.java
字号:
import javax.swing.*;
import javax.imageio.ImageIO;
import javax.media.*;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
public class WebCamSwing extends Applet implements ActionListener
{
public static Player player = null;
private CaptureDeviceInfo cdinfo = null;
private MediaLocator medialocator = null;
private ImagePanel imgpanel = null;
private Buffer buf = null;
private BufferToImage btoi = null;
private int imgWidth = 320;
private int imgHeight = 240;
private Image img = null;
/* 拍照按钮 */
private JButton capture = null;
private JButton save = null;
/*
* 扩展部分 // 保存按钮 private JButton save = null;
*
* //另存为按钮 private JButton saveas = null;
*
* //删除按钮 private JButton delete = null;
*/
public WebCamSwing()
{
setLayout(new BorderLayout());
imgpanel = new ImagePanel();
setBounds(100, 100, 200, 200);
capture = new JButton("拍照");
capture.addActionListener(this);
save = new JButton("保存");
save.addActionListener(this);
/*
* 拓展部分 save = new JButton("保存"); save.addActionListener(this);
delete =
* new JButton("删除"); delete.addActionListener(this); saveas = new
* JButton("另存为"); saveas.addActionListener(this);
*/
String url = "vfw:Microsoft WDM Image Capture (Win32):0";
cdinfo = CaptureDeviceManager.getDevice(url);
medialocator = cdinfo.getLocator();
try
{
player = Manager.createRealizedPlayer(medialocator);
player.start();
Component comp;
if ((comp = player.getVisualComponent()) != null)
{
add(comp, BorderLayout.NORTH);
}
Panel panel = new Panel(new BorderLayout());
panel.add(capture, BorderLayout.NORTH);
panel.add(save, BorderLayout.SOUTH);
add(panel, BorderLayout.CENTER);
add(imgpanel, BorderLayout.SOUTH);
} catch (Exception b)
{
b.printStackTrace();
}
}
/* 点击拍照 */
/*
* ActionEvent: 指示发生了组件定义的动作的语义事件。 当特定于组件的动作(比如
被按下)发生时, 由组件(比如
* Button)生成此高级别事件。 事件被传递给每一个 ActionListener 对象, 这些对
象是使用组件的
* addActionListener 方法注册的,用以接收这类事件。 注:要使用键盘在 Button
上触发 ActionEvent,请使用空格键。
*/
public void actionPerformed(ActionEvent e)
{
JComponent c = (JComponent) e.getSource();
if (c == capture)
{
// 使得FrameGrabbingControl控制player,支持player的类或接口。
// getcontrol后括号里的是前面的要控制FrameGrabbingControl所在的类
FrameGrabbingControl fgc = (FrameGrabbingControl) player
.getControl
("javax.media.control.FrameGrabbingControl");
buf = fgc.grabFrame();
btoi = new BufferToImage((VideoFormat) buf.getFormat());
img = btoi.createImage(buf);
imgpanel.setImage(img);
}
else if (c == save)
{
Frame f=new Frame("保存");
FileDialog fd=new FileDialog(f,"保存文件",FileDialog.SAVE);
fd.setFile("*.JPEG");
fd.setVisible(true);
String savepath=fd.getDirectory();
String savename=fd.getFile();
try
{
ImageIO.write((RenderedImage) img,"JPEG", new File(savepath+savename));
} catch (IOException e1)
{
// TODO 自动生成 catch 块
e1.printStackTrace();
}
} }
class ImagePanel extends Panel
{
private Image ImagePanelimg = null;
public ImagePanel()
{
setLayout(null);
setSize(imgWidth, imgHeight);
}
public void setImage(Image img)
{
this.ImagePanelimg = img;
repaint();
}
public void update(Graphics graphics)
{
if (ImagePanelimg != null)
{
graphics.drawImage(ImagePanelimg, 0, 0, this);
}
}
}
// 关闭摄像头
public static void playerclose()
{
player.close();
player.deallocate();
}
public static void main(String[] args)
{
Frame frame = new Frame("拍照程序");
WebCamSwing cf = new WebCamSwing();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
// playerclose();
System.exit(0);
}
});
frame.add("Center", cf);
frame.pack();
frame.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -