JAVA照相功能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import javax.swing.*;
import javax.swing.event.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.util.*;
import javax.media.control.*;
import javax.media.protocol.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import com.sun.image.codec.jpeg.*;
public class SwingCapture extends Panel implements ActionListener
{
public static Player player = null;
public CaptureDeviceInfo di = null;
public MediaLocator ml = null;
public JButton capture = null;
public Buffer buf = null;
public Image img = null;
public VideoFormatvf = null;
public BufferToImagebtoi = null;
public ImagePanelimgpanel = null;
public SwingCapture()swing外观风格。
{
setLayout(new BorderLayout());设置布局,BorderLayout()一种多层面板。
setSize(320,550);设置面板大小
imgpanel = new ImagePanel();相片图片容器
capture = new JButton("Capture");照相按扭
capture.addActionListener(this);监听这个按扭
//String str1 = "vfw:Logitech USB Video Camera:0";
//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,BorderLayout.CENTER);增加到当前的布局中间到组件容器
add(imgpanel,BorderLayout.SOUTH);增加到当前的布局北边到组件容器
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
Frame. f = new Frame("SwingCapture");创建一个貼画面
SwingCapturecf = new SwingCapture();创建一个容器
f.addWindowListener(new WindowAdapter() {
给java做的图形界面添加关闭事件的时候,使用了WindowAdapter这个类public void windowClosing(WindowEvent e) {
playerclose();
System.exit(0);}});
f.add("Center",cf);向frame容器里输入swing风格中间大小帖的图片
f.pack();打包放进容器
f.setSize(new Dimension(320,550));设定规格大小
f.setVisible(true);显示一个Frame帖(没保存前先显示)
}
public static void playerclose()
{
player.close();
player.deallocate();停止播放器后必须释放内存中的资源
}
public void actionPerformed(ActionEvent e)行为监听
{
JComponent c = (JComponent) e.getSource();创建一个绘画对像
if (c == capture)按拍照后
{
// Grab a frame
FrameGrabbingControlfgc = (FrameGrabbingControl)从视频轨迹中抽取当前帧对像player.getControl("javax.media.control.FrameGrabbingControl");获取当前祯
buf = fgc.grabFrame();抓下来的图片放在buffer的中
// Convert it to an image
btoi = new BufferToImage((VideoFormat)buf.getFormat());取得一个视频格式对像img = btoi.createImage(buf);转化流格式为图片格试
// show the image
imgpanel.setImage(img);引用imgpanel面板显示图片
// save image
saveJPG(img,"c:\\test.jpg");保存图片到本地硬盘
}
}
class ImagePanel extends Panel图片面板
{
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);绘画图形
}
}
}
public static void saveJPG(Image img, String s)保存图片
{
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);从buf中取得图片对像
Graphics2D g2 = bi.createGraphics();取得绘画图形工具
g2.drawImage(img, null, null);绘画图形
FileOutputStreamut = null;创建存放文件流对像
try
{
ut = new FileOutputStream(s);创建存放指定文件流路经对像
}
catch (java.io.FileNotFoundExceptionio)
{
System.out.println("File Not Found");
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);创建一个和指定输出流关联的JPEGImageEncoder对象
JPEGEncodeParamparam = encoder.getDefaultJPEGEncodeParam(bi);此方法根据指定的压缩率浮点值
param.setQuality(0.5f,false);压缩大小为一半
encoder.setJPEGEncodeParam(param);将图片放进输出流
try
{
encoder.encode(bi);编码这个输出流
out.close();关团
}
catch (java.io.IOExceptionio)
{
System.out.println("IOException");
}
}
}。