1. 程式人生 > >呼叫本地攝像頭進行拍照

呼叫本地攝像頭進行拍照

jsp介面程式碼


<div class="col-lg-4 col-md-4 col-sm-4 form-group " >
			 <input type="button" value="拍照" id="saveBtn" onclick="savePhoto()"/>  
</div>
//js程式碼
 //拍照
		function savePhoto() {
			layer.confirm('是否啟動拍照功能', {
				icon : 3,
				title : '提示'
			}, function(index) {
				layer.close(index);
				$.post("/Exchange/servlet/DoctorServlet?type=photosave",
						function() {
						});
			}); 
		}

servlet中的方法

	protected void photosave(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException { 
		try {
            //呼叫拍照
			Demo demo=new Demo();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Demo

	package com.gx.communication;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JPanel;

import org.bytedeco.javacpp.opencv_core.IplImage; 
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.javacv.FrameGrabber.Exception;
 

public class Demo {
	public static void main(String[] args) throws Exception, IOException, InterruptedException {
	new Demo();
	}
 public Demo() throws Exception, InterruptedException{
//		Mat mat = new Mat();
//		int flipCode = 1;
//		flip(converter.convertToMat(要翻轉的Frame), mat, flipCode);
//		//儲存的時候依然需要將Mat轉換
//		BufferedImage bufferedImage = java2dConverter.convert(convert.convert(mat));
//		
		OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
		grabber.setImageWidth(800);
		grabber.setImageHeight(640);
		grabber.start();


		OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
		IplImage grabbedImage = converter.convertToIplImage(grabber.grab());
		CanvasFrame frame = new CanvasFrame("Some Title", CanvasFrame.getDefaultGamma() / grabber.getGamma());
		// frame.setSize(800, 600);
		//frame.setBounds(200, 100, 640, 640);
		// 設定操作介面
		JPanel contentPane = new JPanel();
		//contentPane.setBounds(0, 0, 640, 640);
		Container contentPane2 = frame.getContentPane();


		JButton take_photo = new JButton("拍照");
		JButton save_photo = new JButton("儲存");
		JButton cancle = new JButton("關閉");
		Camera camera = new Camera();
		// 監聽拍攝
		take_photo.addMouseListener(new TakePhotoMouseAdapter(take_photo, camera));
		// 監聽儲存
		save_photo.addMouseListener(new SavePhotoMouseAdapter(grabbedImage));
		// 關閉
		cancle.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
			//	frame.setVisible(false);
			}
		});
		// 新增按鈕
		contentPane.add(take_photo, BorderLayout.SOUTH);
		contentPane.add(save_photo, BorderLayout.SOUTH);
		contentPane.add(cancle, BorderLayout.SOUTH);
		// 新增面板
		contentPane2.add(contentPane, BorderLayout.SOUTH);
		// 操作狀態
		while (frame.isVisible()) {

			// 獲取影象
			if (camera.getState()) {
				grabbedImage = converter.convert(grabber.grab());
			}
			frame.showImage(converter.convert(grabbedImage));
			// 每40毫秒重新整理視訊,一秒25幀
			Thread.sleep(40);
		}
		frame.dispose();
		grabber.stop();
	 
 }
 

}

TakePhotoMouseAdapter

package com.gx.communication;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;

public class TakePhotoMouseAdapter  extends MouseAdapter{
	private JButton jButton;
	private Camera camera;
 
 
	public TakePhotoMouseAdapter(JButton jButton, Camera camera) {
		this.jButton = jButton;
		this.camera = camera;
	}
 
 
	@Override
	public void mouseClicked(MouseEvent arg0) {
		System.out.println("拍照");
		
		// 修改顯示
		if (camera.getState()) {
			jButton.setText("繼續拍照");
			// 暫停拍照
			camera.setState(false);
		} else {
			jButton.setText("拍照");
			// 繼續拍照
			camera.setState(true);
		}
	}

}

SavePhotoMouseAdapter

package com.gx.communication;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter.ToIplImage;

public class SavePhotoMouseAdapter extends MouseAdapter {
private IplImage iplImage;
	
	public SavePhotoMouseAdapter(IplImage iplImage) {
		this.iplImage = iplImage;
	}
 
 
	@Override
	public void mouseClicked(MouseEvent arg0) {
		
		Calendar ca = Calendar.getInstance(); 
		Date da=new Date();
		int strYEAR = ca.get(Calendar.YEAR);
		int strMONDAY = ca.get(Calendar.MONDAY) + 1;
		int strDATE = ca.get(Calendar.DATE); 
		//儲存的名稱
		String code = strYEAR + "" + strMONDAY + "" + strDATE+""+da.getTime()+".jpg";
	  
		String savePath = "D://potose"; //儲存的目錄
		File file = new File(savePath);
		// 判斷上傳檔案的儲存目錄是否存在
		if (!file.exists() && !file.isDirectory()) {
			System.out.println(savePath + "目錄不存在,需要建立");
			// 建立目錄
			file.mkdir();
		}
		
		System.out.println("儲存");
		// 儲存結果提示框
		JFrame myFrame = new JFrame();
		try {
			if (iplImage != null) {
				// 儲存圖片
				cvSaveImage("D://potose//"+code.trim(), iplImage);
				// 傳送修改使用者頭像請求...也可以直接傳送位元組陣列到伺服器,由伺服器上傳圖片並修改使用者頭像
				JOptionPane.showMessageDialog(myFrame, "上傳成功");
			}
		} catch (IOException e) {
			JOptionPane.showMessageDialog(myFrame, "儲存失敗");
			e.printStackTrace();
		} finally {
			// 關閉提示jframe
			myFrame.dispose();
			myFrame = null;
		}
	}
 
 
	public static void cvSaveImage(String path, IplImage image) throws IOException {
		File file = new File(path);
		// ImageIO.write(toBufferedImage(image), "jpg", file);
		// 使用位元組儲存
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		ImageIO.write(toBufferedImage(image), "jpg", out);
		byte[] bs = out.toByteArray();
 
		// 儲存位元組陣列為圖片到本地
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(bs, 0, bs.length);
		fos.close();
 
		out.close();
	}
 
 
	// 通過image獲取bufferedImage
	//iplConverter 可以檢視convert方法可以轉換的物件,Frame IplImage,Mat之間轉換   
	//Java2DFrameConverter讓Frame和BufferedImage之間相互轉換
	public static BufferedImage toBufferedImage(IplImage image) {
		ToIplImage iplConverter = new OpenCVFrameConverter.ToIplImage();
		Java2DFrameConverter java2dConverter = new Java2DFrameConverter();
		BufferedImage bufferedImage = java2dConverter.convert(iplConverter.convert(image));
		return bufferedImage;
	}

}