【问题标题】:Video -> Canvas -> Image ... at a specific resolution?视频 -> 画布 -> 图像 ... 以特定分辨率?
【发布时间】:2016-08-16 07:15:29
【问题描述】:

我正在使用一个 API,它需要我以 300 的分辨率捕获 jpeg 图像。

工作流程是:

  1. 使用视频元素从集成摄像头流式传输。
  2. “拍摄”视频照片并将其绘制到画布元素上。
  3. 使用 .toDataURL() 将图像从画布转移到图像标签。
  4. 将该图像发送到 API 进行验证...

我遇到的问题是我相信画布上绘制的图像取决于它所在的网页/显示器的分辨率。 虽然我可以更改图像的尺寸,但使用 CSS 将两倍大的东西按比例缩小到 look 更高的分辨率; API 一直在回叫我向他们发送的图片质量太低了。

我最终需要使用集成摄像头来捕获和传输分辨率为 300(或更高)的 jpeg,但我无法确定仅使用前端代码是否可行。

感谢您的帮助:)

【问题讨论】:

  • 您可以轻松地将ctx.drawImage(video, 0, 0, 300, 300 / 16 * 9)(假设您的视频是16/9)用于300x(300/16*9) 画布。 (数字可以根据您对分辨率的含义进行更改)。视频取决于您的视频元素大小。
  • 你的意思是分辨率实际上就是我的意思/任何视频需要多大的输出?
  • 我在决议这个词上跳来跳去,因为我真的没有更好的词可供我使用——DPI 和 PPI 总是转入关于哪些适合与网络讨论的对话,如果有的话。所以,我被要求使用的 API,它做的第一件事是检查图像的元数据,如果那里的分辨率大于或等于 300。我基本上的任务是从相机,然后生成的图像可以保存并在 PhotoShop 中打开,图像分辨率中列出了 300+。
  • 我认为现代世界中的分辨率就是视频的大小。下面的答案很不错。缩放视频无论如何都会导致质量损失,您可以在 Photoshop 中进行缩放。以最大分辨率截屏,仅此而已,否则您正在来回移动没有实际用途的数据...

标签: javascript video canvas resolution


【解决方案1】:

虽然未显示,但您可能正在使用视频元素的 widthheight 属性来定义画布元素的大小。

您需要使用videoWidthvideoHeight 属性,因为前者反映的是元素大小,而不是原始视频大小。

如果仍然太小(由视频本身引起),您始终使用视频的纵横比放大元素:

var aspect = video.videoHeight / video.videoWidth;
var wantedWidth = 1280;   // or use height
var height = Math.round(wantedWidth * aspect);

现在您可以将视频绘制到画布上:

canvas.width = wantedWidth;
canvas.height = height;

ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

更新如果您通过“300”指代DPI,请查看this answer。请务必注意,像素 是图像、视频和屏幕的唯一有效和可用单位(相对于英寸、厘米等)。 DPI 以纯粹的任意形式用于建立物理介质(如纸张)和基于像素的源之间的关系,但不会改变实际的像素分辨率。前任高清 1920x1080 的视频在 10 DPI 和 1000 DPI 下都是 1920x1080。DPI 无关紧要。

【讨论】:

  • 感谢您的详细回复。我不喜欢图像的 DPI 必须为 300+,而这对图像的清晰度/大小几乎没有影响。另外,正如您所说,这没关系:)
猜你喜欢
  • 2016-06-08
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2014-10-03
相关资源
最近更新 更多