将HTML5视频呈现为Canvas正在压缩图像

And*_*ock 4 html5 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');
});
Run Code Online (Sandbox Code Playgroud)

这很好用.

然后,即时拍照/静止帧如下:

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

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

那么,如果我这样做:

$('img).attr('src', $canvas[0].toDataURL('image/png'));
Run Code Online (Sandbox Code Playgroud)

这会将画布渲染为图像元素,但图像被压扁,其300x150:/

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

这是怎么回事?

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

ctx.drawImage($video[0], 0, 0, 320, 240);
Run Code Online (Sandbox Code Playgroud)

我仍然最终得到一张300x150的图像,但是它的裁剪.虽然它看起来确实是来自源的正确宽高比

更新2:即使是陌生人,如果我这样做:

ctx.drawImage($video[0], 0, 0, 640, 480);
Run Code Online (Sandbox Code Playgroud)

我仍然最终得到一张300x150的图像,但它的左上角是图像:'(

And*_*ock 10

用css看起来像帆布大小是不够的.你必须做:

canvas.width = 320;
canvas.height = 240;
Run Code Online (Sandbox Code Playgroud)

然后

ctx.drawImage($video[0], 0, 0, 320, 240);
Run Code Online (Sandbox Code Playgroud)

正确地工作

  • 是的."帆布"的内在宽度为300x150.使用CSS更改大小不会改变内在分辨率,与使用CSS更改PNG或JPG的大小相同不会更改图像的固有分辨率.http://stackoverflow.com/q/5034529/8655 (2认同)