我有下一个html模板:
<div className="page">
<video id="video" autoPlay/>
<canvas id="canvas"/>
<div class="btn-wrapper">
<button onClick={this._takePhoto}>Snap Photo</button>
</div>
</div>
这是我的应用程序的屏幕截图。在顶部你可以看到<video>
,在底部<canvas/>
(焦点在devtools)。
**问题:**要将<video/>
图片绘制为<canvas/>
,我应该使用以下奇怪的系数:
const canvas = document.getElementById('canvas'),
context = canvas.getContext("2d"),
video = document.getElementById('video');
//QUESTION: why?!
const widthCoef = 2.1,
heigthCoef = 3;
context.drawImage(video,
0,
0,
video.clientWidth * widthCoef,
video.clientHeight * heightCoef,
0,
0,
canvas.clientWidth,
canvas.clientHeight);
**问题:**如果<video/>
和<canvas/>
具有相同的宽度/高度,为什么要使用系数?
如果我做同样的事但没有系数
context.drawImage(video, 0, 0, video.clientWidth, video.clientHeight, 0, 0, canvas.clientWidth, canvas.clientHeight); //OR
context.drawImage(video, 0, 0, video.clientWidth, video.clientHeight, 0, 0, video.clientWidth, video.clientHeight); //OR
context.drawImage(video, 0, 0, canvas.clientWidth, canvas.clientHeight, 0, 0, canvas.clientWidth, canvas.clientHeight);
我得到一张放大的图片:
更新
我的新调整大小版本:
_resizeCanvas() {
const canvas = document.getElementById('canvas'),
video = document.getElementById('video');
const width = +window.getComputedStyle(video, null).getPropertyValue('width').replace('px', ''),
height = +window.getComputedStyle(video, null).getPropertyValue('height').replace('px', '');
video.width = width;
video.height = height;
canvas.width = width;
canvas.height = height;
},
4条答案
按热度按时间x0fgdtte1#
这些幻数系数对应于
video
对象大小和画布大小之间的比率。假设您的
video
大小为(400 x 300)
,并且您希望将其显示在大小为(200 x 150)
的画布上。它将调整整个
video
的大小以适合画布。但是,您使用的是
drawImage()
的剪切版本。前四个坐标参数描述剪切参数。例如,在以下情况下,它占用完整video
的四分之一:由于属性
canvas.clientWidth
和canvas.clientHeight
大于canvas.width
和canvas.height
,因此图像被剪切。这是由于CSSdisplay: flex;
造成的。要显示完整图像,请用途:lg40wkob2#
这里是我的问题的工作小提琴。我还没有时间去调查为什么它没有在我的应用程序上工作。将在不久的将来更新。
HTML5-video - autoplay
选项,不知道如何在StackOverflow上做同样的事情 *1.Reactjs https://jsfiddle.net/69z2wepo/18812/
JS+联合查询
React
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
ncgqoxb03#
我对此做了一些测试,似乎第3个和第4个参数,即您要从源中获取的区域的宽度和高度,是相对于媒体的原始大小,而不是显示媒体的元素的大小。因此,它基于视频的原始尺寸,而不是视频元素的宽度和高度。
我很惊讶非剪辑版本不起作用。如果你这样做的话,它似乎应该起作用:
这将获取完整的视频图像,并将其显示在画布的左上角以及画布的整个宽度和高度上。
y1aodyip4#
我在我的React应用程序中也遇到过这个问题。我的解决方案是在画布标签上设置宽度和高度 prop 。
并使用video.widht\video.height填充上下文: