Java摄像头拍照并截图,等比缩放后保存到数据库后再显示到桌面

一.功能界面展示:

二.代码展示:

以下是Swing窗体,按钮设置。

    /**摄像头面板*/
	static OpenCVFrameConverter.ToIplImage converter = new         
    OpenCVFrameConverter.ToIplImage();
	private CanvasFrame canvas = new CanvasFrame("摄像头");//新建一个窗口
	OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
	private JLabel canvasPanel = new JLabel(); // 照片显示
	private JPanel cameraPanel = new JPanel(); // 摄像头JPanel

    /**开启摄像头按钮*/
    private JButton startButton = new JButton("开  启");
    /**拍摄摄像头按钮*/
    private JButton cameraButton = new JButton("拍  摄");
    /**关闭摄像头按钮*/
    private JButton stopButton = new JButton("关  闭");

    /**摄像头面板*/
		cameraPanel.setBackground(new Color(231, 230, 230));
		cameraPanel.setBounds(getProportionWidth(630), getProportionHeight(15), getProportionWidth(260),
				getProportionHeight(280));
		cameraPanel.setLayout(null);
		JPanel8.add(cameraPanel);

		//照片显示面板
		canvasPanel.setBounds(getProportionWidth(70), getProportionHeight(15), getProportionWidth(230),
				getProportionHeight(195));
		canvasPanel.setBackground(new Color(231, 230, 230));
		canvasPanel.setLayout(null);
		canvasPanel.setBorder(null);
		cameraPanel.add(canvasPanel);
		//默认显示无照片
		ImageIcon noimage = new ImageIcon(ClassLoader.getSystemResource("img/noimages.png"));        
                canvasPanel.setIcon(noimage);

1.开启按钮代码:

功能:打开摄像头窗体,每过50秒获取一次图像。

    /**开始按钮*/
		startButton.setBackground(Color.white);
		startButton.setBounds(getProportionWidth(70), getProportionHeight(200), getProportionWidth(50),
				getProportionHeight(20));
		startButton.setFont(new Font("华文新魏",Font.PLAIN,15));
		cameraPanel.add(startButton);
		startButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new Thread(new Runnable() {
					@Override
					public void run() {
						flag = true;
						while (flag){
							try {
								grabber.start();   //开始获取摄像头数据
								canvas.show();//显示窗体
							//	canvas.setAlwaysOnTop(true); //页面一直在最上面
								canvas.setPreferredSize(new Dimension(600, 500));//设置窗体大小
								canvas.setLocation(0, 0);//设置窗体位置
								canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame是一帧视频图像
								canvas.setResizable(false);// 静止放大缩小

								try {
									Thread.sleep(50);//50毫秒刷新一次图像
								} catch (InterruptedException e1) {
									e1.printStackTrace();
								}
							} catch (FrameGrabber.Exception e1) {
								e1.printStackTrace();
							}
						}
					}
				}).start();
			}
		});

2.拍照按钮代码

功能说明:

1.将图片保存到本地:在D盘新增一个文件夹,将截取的图片放入;

2.图片处理:读取本地文件夹的文件,进行缩放处理后,保存到数据库;

3.展示图片:读取数据库的图片展现到界面上

4.删除本地文件夹

5.关闭页面,停止抓取

        /**拍摄按钮*/
		cameraButton.setBackground(Color.white);
		cameraButton.setBounds(getProportionWidth(130), getProportionHeight(200), getProportionWidth(50),
				getProportionHeight(20));
		cameraButton.setFont(new Font("华文新魏",Font.PLAIN,15));
		cameraPanel.add(cameraButton);
		cameraButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					opencv_core.Mat mat = converter.convertToMat(grabber.grabFrame());
					//在D盘新建一个文件夹
					File file = new File("D:\\img");
					file.mkdirs();
					String filePath ="d:\\img\\"+ hyhMyJTF.getText().trim() + ".jpg";//图片路径
					//将拍照的图片放入文件夹中,并用会员号做文件名
					opencv_imgcodecs.imwrite(filePath, mat);
					/**读取本地图片*/
//					FileInputStream in;
//					in = ImageUtil.readImage(filePath);

					BufferedImage result = null;
					BufferedImage im = ImageIO.read(new File(filePath));
					/** 原始图像的宽度和高度 */
					int width = im.getWidth();
					int height = im.getHeight();
					//压缩计算
					/**这个参数是要转化成的倍数,如果是1就是转化成1倍*/
					float resizeTimes = 0.5f;
					/** 调整后的图片的宽度和高度 */
					int toWidth = (int) (width * resizeTimes);
					int toHeight = (int) (height * resizeTimes);
					/** 新生成结果图片 */
					result = new BufferedImage(toWidth, toHeight,
							BufferedImage.TYPE_INT_RGB);
					result.getGraphics().drawImage(
							im.getScaledInstance(toWidth, toHeight,
									java.awt.Image.SCALE_SMOOTH), 0, 0, null);
					/**将图片转成InputStream存入到数据库*/
					ByteArrayOutputStream os = new ByteArrayOutputStream();
					ImageIO.write(result, "jpg", os);
					InputStream imageInput = new ByteArrayInputStream(os.toByteArray());
					//保存到数据库中
					VcvoyageBoardingRecodeDAO vcvoyageBoardingRecodeDAO = new VcvoyageBoardingRecodeDAO();
					vcvoyageBoardingRecodeDAO.insertPicture(hyhMyJTF.getText().trim(),imageInput);
					//删除本地文件
					if (file.exists()) {//判断文件是否存在
						if (file.isFile()) {//判断是否是文件
							file.delete();//删除文件
						} else if (file.isDirectory()) {//否则如果它是一个目录
							File[] files = file.listFiles();//声明目录下所有的文件 files[];
							for (int i = 0;i < files.length;i ++) {//遍历目录下所有的文件
								files[i].delete();//把每个文件用这个方法进行迭代
							}
							file.delete();//删除文件夹
						}
					} else {
						System.out.println("所删除的文件不存在");
					}
					//查询图片
					V_membership v_membership = vcvoyageBoardingRecodeDAO.findPicture(hyhMyJTF.getText().trim());
					Blob picture = v_membership.getM_picture();//获取图片
					//Blob类型转image,并显示到系统中
					InputStream is =  picture.getBinaryStream(); //转换成输入流
					BufferedImage img = ImageIO.read(is);
					Image images;
					images = img.getScaledInstance(300, 240, Image.SCALE_DEFAULT);
					canvasPanel.setIcon(new ImageIcon(images));
					new Thread(()->{
						try {
							Thread.sleep(1000);
							flag = false;
							canvas.dispose();
							grabber.stop();//停止抓取
						} catch (Exception e1) {
							e1.printStackTrace();
						}
					}).start();
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		});

3.关闭按钮代码

功能说明:关闭窗体,关闭抓取

        /**关闭按钮*/
		stopButton.setBackground(Color.white);
		stopButton.setBounds(getProportionWidth(190), getProportionHeight(200), getProportionWidth(50),
				getProportionHeight(20));
		stopButton.setFont(new Font("华文新魏",Font.PLAIN,15));
		cameraPanel.add(stopButton);
		stopButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					flag = false;
					canvas.dispose();
					grabber.stop();//停止抓取
				} catch (FrameGrabber.Exception e1) {
					e1.printStackTrace();
				}
			}
		});

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值