项目需求:使用google浏览器拍照保存到服务器。
google直接有通过js调取摄像头的解决办法navigator.mediaDevices.getUserMedia,
只需要传一个参数constraints
let mediaStreamTrack = null; // 视频对象(全局)
let constraints = {
// video: {width: 3000, height: 2000},
video: true,
audio: true
};
let promise = navigator.mediaDevices.getUserMedia(constraints);
promise.then(function (MediaStream) {
mediaStreamTrack = typeof MediaStream.stop === 'function' ? MediaStream : MediaStream.getTracks()[1];
video.srcObject = MediaStream;
video.muted = true;
video.play();
});
基本也很简单,就是调取摄像头然后放到video标签里面进行播放。constraints参数意思就是读取音频和视频。这样就可以直接获取摄像头的视频流。但是这个视频流不是很清晰(疯狂投诉)。。。
后来翻阅文档发现这个constraints的video可以传别的参数。width和height。官网是这样写的
当由于隐私保护的原因,无法访问用户的摄像头和麦克风信息时,应用可以使用额外的constraints参数请求它所需要或者想要的摄像头和麦克风能力。
下面演示了应用想要使用1280x720的摄像头分辨率:
本来以为这个参数加上去会变得清晰。但是事实是无效的。这个应该是获取指定分辨率摄像头的。
于是就有了另一种解决方案。通过node去调取得力高拍仪原生拍照保存的图片路径。但是图片和我们的系统关联只能通过时间去关联。就有了以下代码
var express = require('express');
var router = express.Router();
const db = require('./db');
const path = require('path');
const fs = require('fs');
const dir = '文件路径'; // 注意要使用\\
// 获取图片
router.get('/touchScreen/getImages', function(req, res, next) {
let sql = `SELECT [INSPECTION_NBR]
,[STATUS]
,[ADD_DATETIME]
,[START_DATETIME]
,[END_DATETIME]
FROM [FIRST_INSPECTION] WHERE [INSPECTION_NBR]= ${req.query.INSPECTION_NBR}`;
db.sql(sql, (result) => {
if(!result.recordsets) {
res.json({
Status: -999,
Message: '操作失败!'
})
return;
}
let files = fs.readdirSync(dir);
let startDataTime = result.recordsets[0][0].START_DATETIME;
let filterFiles = files.filter((x) => {
return fs.statSync(dir + x).mtime.getTime() >= startDataTime
})
let imgArr = [];
for(let i = 0; i < filterFiles.length; i++) {
let bitmap = fs.readFileSync(dir + filterFiles[i]);
let base64str = Buffer.from(bitmap, 'binary').toString('base64'); // base64编码
imgArr.push({
name: filterFiles[i],
base64: base64str
})
}
res.json({
Status: 0,
Data: imgArr,
Message: "操作成功"
});
})
});
通过时间去找到符合条件的图片,然后发回给前端。
网友评论