html - 将 HTML5 视频渲染到 Canvas 会压缩图像

标签 html canvas getusermedia

我正在尝试使用 getUserMedia 从用户的网络摄像头拍摄照片。

来自相机的图像是 640x480(大概可以是任何尺寸,具体取决于用户的网络摄像头)。

我有一个视频标签,大小为 320x240,带有 css,我正在将网络摄像头图像渲染到它上面,如下所示:

var $video = $('video');
navigator.getUserMedia({ video: true }, function (stream) {
    $video[0].mozSrcObject = stream;
    $video[0].play();
    localMediaStream = stream;
}, function () {
    console.log('sadtrombone.com');
});

这很好用。

然后,我像这样拍一张照片/静帧:

var ctx = $canvas[0].getContext('2d');
ctx.drawImage($video[0], 0, 0, $canvas[0].width, $canvas[0].height);

这会将图像绘制到 Canvas 上,但看起来有点模糊:/

然后,如果我这样做:

$('img).attr('src', $canvas[0].toDataURL('image/png'));

这将 Canvas 呈现为图像元素,但图像被压扁,它的 300x150 :/

$canvas[0].width == 300$canvas[0].height == 150

这是怎么回事?

更新:有趣/奇怪 - 如果我这样做:

ctx.drawImage($video[0], 0, 0, 320, 240);

我仍然得到一张 300x150 的图像,但它被裁剪了。虽然从源头上看确实是正确的纵横比

更新 2: 更奇怪的是,如果我这样做:

ctx.drawImage($video[0], 0, 0, 640, 480);

我最终还是得到了一张 300x150 的图片,但它位于图片的左上四分之一处 :'(

最佳答案

用 css 调整 Canvas 的大小似乎是不够的。你必须做:

canvas.width = 320;
canvas.height = 240;

然后

ctx.drawImage($video[0], 0, 0, 320, 240);

工作正常

关于html - 将 HTML5 视频渲染到 Canvas 会压缩图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14821481/

相关文章:

ios - Navigator.mediaDevices.getUserMedia 不适用于 iOS 12 Safari

javascript - 如何制作,同时点击一个按钮后下拉框会自动下拉

jquery - Uncaught ReferenceError JQuery

Android Canvas 手指绘制

javascript - 如何在 JavaScript 中生成简单的 3D 图像

HTML5 getUserMedia() 媒体源

html - 是否可以为 HTML5 API 创建自定义用户权限请求对话框?

html - 左 Div 和右 Div 的高度应该相等..!

javascript - HTML: block 元素中的文本;获取点击的确切位置

javascript - 使用 CORS 通过 Canvas 的 HTML5 视频截图