首页 > 其他分享 >react函数组件实现调用摄像头拍摄功能

react函数组件实现调用摄像头拍摄功能

时间:2024-08-09 18:52:42浏览次数:19  
标签:canvas const closeMedia react video cameraVideoRef 组件 摄像头

import React, { useEffect, useRef, useState } from 'react'

export default function PaiZhao() {

    const cameraVideoRef = useRef(null);

    const cameraCanvasRef = useRef(null);

    const [Img, setImg] = useState("")

    useEffect(() => {

        openMedia() //打开摄像头

    }, [])

    function successFunc(mediaStream) {

        const video = cameraVideoRef.current;

        // const video = document.getElementById('cameraVideo') as HTMLVideoElement;

        // 旧的浏览器可能没有srcObject

        if ('srcObject' in video) {

            video.srcObject = mediaStream;

        }

        video.onloadedmetadata = () => {

            video.play();

        };

    }

    function errorFunc(err) {

        console.log(`${err.name}: ${err.message}`);

        // always check for errors at the end.

    }

    // 启动摄像头

    const openMedia = () => { // 打开摄像头

        const opt = {

            audio: false,

            video: {

                width: 200,

                height: 200

            }

        };

        navigator.mediaDevices.getUserMedia(opt).then(successFunc).catch(errorFunc);

    };

    // 关闭摄像头

    const closeMedia = () => {

        const video = cameraVideoRef.current;

        const stream = video.srcObject;

        if ('getTracks' in stream) {

            const tracks = stream.getTracks();

            tracks.forEach(track => {

                track.stop();

            });

        }

    };

    const getImg = () => { // 获取图片资源

        const video = cameraVideoRef.current;

        const canvas = cameraCanvasRef.current;

        if (canvas == null) {

            return;

        }

        const ctx = canvas.getContext('2d');

        ctx.drawImage(video, 10, 0, 300, 150); // 把视频中的一帧在canvas画布里面绘制出来

        const imgStr = canvas.toDataURL(); // 将图片资源转成字符串

        const base64Img = imgStr.split(';base64,').pop(); // 将图片资源转成base64格式

        const imgData = {

            base64Img

        };

        closeMedia(); // 获取到图片之后可以自动关闭摄像头

        return imgData;

    };

    const saveImg = () => { // 保存到本地

        const data = getImg();

        setImg('data:image/png;base64,' + data.base64Img)

    };

    return (

        <div>

            <div className='PaiZhao' X>

                <video

                    id="cameraVideo"

                    ref={cameraVideoRef}

                    className='PaiZhao_video'style={{width:'100px',height:'100px'}}

                />

            </div>

            <div className='PaiZhao' >

                <canvas

                    id="cameraCanvas"

                    ref={cameraCanvasRef}

                    className='PaiZhao_canvas'

                    style={{width:'100px',height:'100px'}}

                />

            </div>

            {/* <img id="imgTag" src={Img} alt="imgTag" />  */}

            <button onClick={() => {

                saveImg()

                closeMedia()

            }} >保存</button>

              <button onClick={() => { openMedia() }} >开启摄像头</button>

            <button onClick={() => { closeMedia() }} >关闭摄像头</button>

        </div>

    )

}


 

标签:canvas,const,closeMedia,react,video,cameraVideoRef,组件,摄像头
From: https://blog.csdn.net/wzmhl/article/details/141062361

相关文章

  • React性能之--如何避免组件重复渲染?
         在react中,我们会发现存在组件会重复渲染,虽然说如果项目不大的话,这点影响不大,但是我们还是尽量避免组件渲染比较好,养成好习惯,尽可能让不管是大小项目,都让性能尽可能优化。那我们如何避免组件重复渲染呢?  一、在React中,可以通过以下几种方法来避免组件重复......
  • vue-页面高亮展示code代码组件
     在main.js里引用组件importhljsfrom"highlight.js";import"highlight.js/styles/atom-one-dark.css";Vue.directive("highlight",function(el){letblocks=el.querySelectorAll("precode");blocks.forEach((block)......
  • 如何快速开始进行echart组件开发
    1、定义chart组件<template><divref="chart"></div></template><script>importelementResizeDetectorfrom"element-resize-detector";import*asechartsfrom"echarts/core";import{LineChart,Ba......
  • 自定义周选择组件、年选择组件
    //周组件weekSelect<!--周选择组件--><template><divref="viYearSelect"class="vi-year-select"><ui-inputv-model="selectVal":placeholder="placeholder":d......
  • React原理之React整体渲染流程
    前置知识:深度优先搜索(DFS)、Fiber节点在上一篇React原理篇之React整体架构解读中,提到了Fiber架构中的几个核心概念:Scheduler(调度器):根据任务的优先级安排任务执行顺序。Reconciler(协调器):根据新旧虚拟DOM树的差异确定需要更新的部分。Renderer(渲染器):将更新的虚拟......
  • ant disign vue pro 使用日期组件,无法动态赋值 解决
    原文地址:https://blog.csdn.net/weixin_43865196/article/details/121849591组件使用渲染<a-date-picker v-model="date" format="YYYY-MM-DD" valueFormat="YYYYMMDD" :allowClear="false" @change="(date,dateStr)=>{ this.da......
  • Vue3实现印章徽章组件
    1、组件结构2、组件封装src/components/StampBadge/src/StampBadge.vue文件代码<template><divclass="first-ring"v-bind="getBindValue":class="getStampBadgeClass"><divclass="second-ri......
  • Vue3水印组件
    1、组件封装<template><divref="watermarkContainerRef"class="watermark-container"><!--插槽--><slot></slot></div></template><scriptsetup>import{ref,onMounted,watc......
  • OpenTiny HUICharts开源发布,带你了解一个简单、易上手的图表组件库
    摘要:目前OpenTinyHUICharts已经成功落地在华为内部100多个产品中,持续提升了用户的可视化体验。本文分享自华为云社区《OpenTinyHUICharts正式开源发布,一个简单、易上手的图表组件库》,作者:OpenTiny。引言大家好!我们非常高兴地跟大家宣布,今天正式发布我们的新产品——Open......
  • 使用 defineNuxtComponent`定义 Vue 组件
    title:使用defineNuxtComponent`定义Vue组件date:2024/8/9updated:2024/8/9author:cmdragonexcerpt:摘要:本文介绍了在Nuxt3中使用defineNuxtComponent辅助函数定义类型安全的Vue组件的方法,适用于习惯OptionsAPI的开发者。defineNuxtComponent支持asyncData获取异......