呼叫本地攝像頭進行拍照
阿新 • • 發佈:2018-12-17
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;
}
}