html结合js设计一个可拍照可录制可下载的摄像头页面

功能如下

 

下载后的照片或视频为当前北京时间

 

html文件用户设置样式,代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Camera App</title>
</head>
<body>
    <video id="video" width="640" height="480" autoplay></video>
    <button id="snap">拍照</button>
    <button id="record">开始录像</button>
    <button id="stop" disabled>停止录像</button>
    <canvas id="canvas" width="640" height="480" style="display:none;"></canvas>
    <a id="downloadPhoto" style="display:none;">下载照片</a>
    <a id="downloadVideo" style="display:none;">下载视频</a>
    <button id="toggleGrayScale">切换灰度滤镜</button>
    <script src="camera.js"></script>
</body>
</html>

 一些声明

document.addEventListener('DOMContentLoaded', function() {// 当文档加载完成时,执行函数
    var video = document.getElementById('video');    // 获取页面中id为'video'的<video>元素
    var canvas = document.getElementById('canvas');    // 获取页面中id为'canvas'的<canvas>元素
    var context = canvas.getContext('2d');    // 获取canvas的2D绘图上下文
    var downloadPhoto = document.getElementById('downloadPhoto');    // 获取页面中id为'downloadPhoto'的<a>元素,用于下载照片
    var downloadVideo = document.getElementById('downloadVideo');    // 获取页面中id为'downloadVideo'的<a>元素,用于下载视频
    var recordButton = document.getElementById('record');    // 获取页面中id为'record'的按钮元素,用于开始录制视频
    var stopButton = document.getElementById('stop');    // 获取页面中id为'stop'的按钮元素,用于停止录制视频
    var mediaRecorder;    // 声明一个变量用于存储MediaRecorder对象
    var chunks = [];    // 声明一个数组用于存储录制的视频片段
    var isGrayScale = false; // 用于跟踪是否应用了灰度滤镜

启动摄像头

    navigator.mediaDevices.getUserMedia({ video: true })
        .then(function(stream) {
            video.srcObject = stream;
            video.play();
        })
        .catch(function(error) {
            console.error("Error accessing media devices.", error);
        });

拍照功能

    document.getElementById('snap').addEventListener('click', function() {
        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        context.drawImage(video, 0, 0, canvas.width, canvas.height);
        var dataUrl = canvas.toDataURL('image/png');
        downloadPhoto.href = dataUrl;
        downloadPhoto.download = getBeijingTimeString()+'.png';
        downloadPhoto.style.display = 'inline';
    });

开始录像

    recordButton.addEventListener('click', function() {
        mediaRecorder = new MediaRecorder(video.srcObject);
        mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
        };
        mediaRecorder.start();
        recordButton.disabled = true;
        stopButton.disabled = false;
    });

停止录像

    stopButton.addEventListener('click', function() {
        mediaRecorder.stop();
        recordButton.disabled = false;
        stopButton.disabled = true;
        mediaRecorder.onstop = function() {
            var blob = new Blob(chunks, { type: 'video/mp4' });
            chunks = [];
            var videoUrl = URL.createObjectURL(blob);
            downloadVideo.href = videoUrl;
            downloadVideo.download = getBeijingTimeString()+'.mp4';
            downloadVideo.style.display = 'inline';
        };
    });

切换灰度滤镜

    function toggleGrayScale() {
        isGrayScale = !isGrayScale; // 切换状态
        var effect = isGrayScale ? 'grayscale(100%)' : 'none';
        video.style.filter = effect;
    }

toggleGrayScale按钮添加事件监听器来切换灰度滤镜

    document.getElementById('toggleGrayScale').addEventListener('click', toggleGrayScale);
});

获取当前北京时间的字符串

function getBeijingTimeString() {
    var date = new Date(); // 获取当前时间
    var year = date.getFullYear(); // 年
    var month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月
    var day = date.getDate().toString().padStart(2, '0'); // 日
    var hours = date.getHours().toString().padStart(2, '0'); // 小时
    var minutes = date.getMinutes().toString().padStart(2, '0'); // 分钟
    var seconds = date.getSeconds().toString().padStart(2, '0'); // 秒

    // 拼接成年+月+日+小时+分钟+秒的格式
    return `${year}${month}${day}${hours}${minutes}${seconds}`;
}

 

posted @ 2024-11-02 18:35  Wild-bokeyuan  阅读(20)  评论(0编辑  收藏  举报