Javascript HTML5镜像网络摄像头画布
我正在尝试拍摄一个网络摄像头提要-(横向格式),切掉中间的一位(纵向格式),并将其渲染到画布上,以便它以1920像素填充屏幕纵向1080px(为此,我将切掉的一位缩放3.8)。然后我需要翻转画布,以便镜像图像。我成功地切下了中间的部分,并将其渲染到画布上。。。我就是想不出怎么把它翻过来 编辑 感谢所有为我指出上下文的人。scale(-1,1)-我的问题是,我已经在使用scale。。。我认为我的问题与保存上下文有关,但我尝试的一切都失败了Javascript HTML5镜像网络摄像头画布,javascript,html,canvas,webcam,webcam-capture,Javascript,Html,Canvas,Webcam,Webcam Capture,我正在尝试拍摄一个网络摄像头提要-(横向格式),切掉中间的一位(纵向格式),并将其渲染到画布上,以便它以1920像素填充屏幕纵向1080px(为此,我将切掉的一位缩放3.8)。然后我需要翻转画布,以便镜像图像。我成功地切下了中间的部分,并将其渲染到画布上。。。我就是想不出怎么把它翻过来 编辑 感谢所有为我指出上下文的人。scale(-1,1)-我的问题是,我已经在使用scale。。。我认为我的问题与保存上下文有关,但我尝试的一切都失败了 <script> // Put
<script>
// Put event listeners into place
window.addEventListener("DOMContentLoaded", function() {
// Grab elements, create settings, etc.
var canvas = document.getElementById("canvas"),
context = canvas.getContext("2d"),
video = document.getElementById("video"),
videoObj = {
video: {
mandatory: {
minWidth: 1280,
minHeight: 720,
/*Added by Chad*/
maxWidth: 1280,
maxHeight: 720
}
}
},
errBack = function(error) {
console.log("Video capture error: ", error.code);
};
// Put video listeners into place
if(navigator.getUserMedia) { // Standard
navigator.getUserMedia(videoObj, function(stream) {
video.src = stream;
video.play();
}, errBack);
} else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
navigator.webkitGetUserMedia(videoObj, function(stream){
video.src = window.URL.createObjectURL(stream);
video.play();
}, errBack);
} else if(navigator.mozGetUserMedia) { // WebKit-prefixed
navigator.mozGetUserMedia(videoObj, function(stream){
video.src = window.URL.createObjectURL(stream);
video.play();
}, errBack);
}
/*
video : video source tag
320,0 : the shift coords
320,180 : the canvas size
0,0 : no shift in the canvas
640,360 : important ! it’s the native resolution of video source
*/
context.scale(3.8,3.8);
function loop(){
context.drawImage(video, 450, 0, 1080, 1920, 0, 0, 720, 1280);
setTimeout(loop, 1000 / 30);
}
loop();
}, false);
</script>
<video id="video" height="1080" width="1920" autoplay></video>
<canvas id="canvas" height="1920" width="1080"></canvas>
// Put event listeners into place
window.addEventListener("DOMContentLoaded", function() {
// Grab elements, create settings, etc.
var canvas = document.getElementById("canvas"),
context = canvas.getContext("2d"),
video = document.getElementById("video"),
videoObj = {
video: {
mandatory: {
minWidth: 1280,
minHeight: 720,
/*Added by Chad*/
maxWidth: 1280,
maxHeight: 720
}
}
},
errBack = function(error) {
console.log("Video capture error: ", error.code);
};
// Put video listeners into place
if(navigator.getUserMedia) { // Standard
navigator.getUserMedia(videoObj, function(stream) {
video.src = stream;
video.play();
}, errBack);
} else if(navigator.webkitGetUserMedia) { // WebKit-prefixed
navigator.webkitGetUserMedia(videoObj, function(stream){
video.src = window.URL.createObjectURL(stream);
video.play();
}, errBack);
} else if(navigator.mozGetUserMedia) { // WebKit-prefixed
navigator.mozGetUserMedia(videoObj, function(stream){
video.src = window.URL.createObjectURL(stream);
video.play();
}, errBack);
}
/*
video : video source tag
320,0 : the shift coords
320,180 : the canvas size
0,0 : no shift in the canvas
640,360 : important ! it’s the native resolution of video source
*/
context.scale(-3.8,3.8);
context.translate(-720,0);
function loop(){
context.drawImage(video, 450, 0, 1080, 1920, 0, 0, 720, 1280);
setTimeout(loop, 1000 / 30);
}
loop();
}, false);
//将事件侦听器放置到位
addEventListener(“DOMContentLoaded”,function()){
//抓取元素、创建设置等。
var canvas=document.getElementById(“canvas”),
context=canvas.getContext(“2d”),
video=document.getElementById(“视频”),
videoObj={
视频:{
强制性:{
最小宽度:1280,
身高:720,
/*乍得补充*/
最大宽度:1280,
最大高度:720
}
}
},
errBack=函数(错误){
日志(“视频捕获错误:”,错误代码);
};
//将视频侦听器放置到位
if(navigator.getUserMedia){//Standard
getUserMedia(videoObj,函数(流){
video.src=流;
video.play();
},errBack);
}else if(navigator.webkitGetUserMedia){//WebKit前缀
webkitGetUserMedia(videoObj,函数(流){
video.src=window.URL.createObjectURL(流);
video.play();
},errBack);
}else if(navigator.mozzetusermedia){//WebKit前缀
mozGetUserMedia(videoObj,函数(流){
video.src=window.URL.createObjectURL(流);
video.play();
},errBack);
}
/*
视频:视频源标签
320,0:轮班协调
320180:画布大小
0,0:画布中没有移动
640360:重要!这是视频源的本机分辨率
*/
背景量表(3.8,3.8);
函数循环(){
drawImage(视频,450、0、1080、1920、0、0、720、1280);
设置超时(循环,1000/30);
}
loop();
},假);
//将事件侦听器放置到位
addEventListener(“DOMContentLoaded”,function()){
//抓取元素、创建设置等。
var canvas=document.getElementById(“canvas”),
context=canvas.getContext(“2d”),
video=document.getElementById(“视频”),
videoObj={
视频:{
强制性:{
最小宽度:1280,
身高:720,
/*乍得补充*/
最大宽度:1280,
最大高度:720
}
}
},
errBack=函数(错误){
日志(“视频捕获错误:”,错误代码);
};
//将视频侦听器放置到位
if(navigator.getUserMedia){//Standard
getUserMedia(videoObj,函数(流){
video.src=流;
video.play();
},errBack);
}else if(navigator.webkitGetUserMedia){//WebKit前缀
webkitGetUserMedia(videoObj,函数(流){
video.src=window.URL.createObjectURL(流);
video.play();
},errBack);
}else if(navigator.mozzetusermedia){//WebKit前缀
mozGetUserMedia(videoObj,函数(流){
video.src=window.URL.createObjectURL(流);
video.play();
},errBack);
}
/*
视频:视频源标签
320,0:轮班协调
320180:画布大小
0,0:画布中没有移动
640360:重要!这是视频源的本机分辨率
*/
背景量表(-3.8,3.8);
上下文。翻译(-720,0);
函数循环(){
drawImage(视频,450、0、1080、1920、0、0、720、1280);
设置超时(循环,1000/30);
}
loop();
},假);
对于水平翻转,可以使用上下文.scale(-1,1)代码>
从
编辑
作为最后手段,可以使用此CSS
#canvas {
-moz-transform: scaleX(-1);
-o-transform: scaleX(-1);
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
filter: FlipH;
-ms-filter: "FlipH";
}
如果需要,这些都可以通过javascript动态应用。未经测试,但应该有希望的工作 您不应该使用ctx.scale
和ctx.translate
方法进行裁剪
相反,在加载视频时,计算裁剪位置,然后在绘图循环中应用这些计算的位置
完成后,很容易应用context.scale(-1,1)代码>由@Mahout提出。
注意,您还需要context.translate(canvas.width,0)在应用scale()之前进行编码>
我重构了您的代码,因为您请求视频强制令的方式是(chrome也是如此)
我也更改了您的循环,以便仅在加载视频时调用它,无需尝试绘制任何尚不存在的内容,并且我使用该方法更改了您的setTimeout
,该方法大约以30fps的速度触发
//将事件侦听器放置到位
addEventListener(“DOMContentLoaded”,function()){
//抓取元素、创建设置等。