您当前的位置:首页 > 电脑百科 > 软件技术 > 软件技术

聊聊浏览器最新特性 ImageCapture?

时间:2023-05-22 17:11:03  来源:今日头条  作者:高级前端进阶

1.什么是ImageCapture?

MediaStream Image Capture API 的 ImageCapture 接口提供了从相机或其他摄影设备捕获图像或照片的方法。 它提供了一个接口,用于从通过有效的 MediaStreamTrack 引用的摄影设备捕获图像。

什么是ImageCapture?图片来自https://www.freepik.com/的marcovector并加工

2.ImageCapture的API 机制

ImageCapture 对象是使用 MediaStreamTrack 作为源构建的。 API 有两个捕获方法 takePhoto() 和 grabFrame() 以及检索相机功能和设置,同时提供了更改设置的诸多方法。

2.1 takePhoto

takePhoto() 将单次摄影曝光的结果作为 Blob 返回,该 Blob 可以下载、由浏览器存储或显示在 img 元素中。 此方法使用可用的最高摄影相机分辨率。

navigator.mediaDevices.getUserMedia({video: true})
    .then(gotMedia)
    .catch(error => console.error('getUserMedia() error:', error));
function gotMedia(mediaStream) {
    const mediaStreamTrack = mediaStream.getVideoTracks()[0];
    const imageCapture = new ImageCapture(mediaStreamTrack);
    // 构造函数
    console.log(imageCapture);
}

注意:要在不同的摄像头之间进行选择,例如手机上的前置摄像头和后置摄像头,可以通过
navigator.mediaDevices.enumerateDevices() 方法获取可用设备列表,然后在 getUserMedia() 约束中设置 deviceId(具体查看文末链接代码)。如下调用takePhoto方法:

const img = document.querySelector('img');
// ...
imageCapture.takePhoto()
    .then(blob => {
    img.src = URL.createObjectURL(blob);
    img.onload = () => { URL.revokeObjectURL(this.src); }
    })
    .catch(error => console.error('takePhoto() error:', error));

2.2 grabFrame

grabFrame() 将 theTrack 中的实时视频快照作为 ImageBitmap 对象返回,该对象可以绘制在画布上,然后进行后期处理以有选择地更改颜色值。

请注意,ImageBitmap 将仅具有视频轨道的分辨率,而通常低于相机的静止图像分辨率。

比如下面的示例代码:

const canvas = document.querySelector('canvas');
// ...
imageCapture.grabFrame()
    .then(imageBitmap => {
    canvas.width = imageBitmap.width;
    canvas.height = imageBitmap.height;
    canvas.getContext('2d').drawImage(imageBitmap, 0, 0);
    })
    .catch(error => console.error('grabFrame() error:', error));

3.ImageCapture照片设置和功能

照片的选项、设置与 theImageCapturer 或 MediaStreamTrack 相关联,具体取决于给定的功能/设置是否对 MediaStreamTrack 具有立即可识别的效果,即是否“实时”。 例如,更改缩放级别会立即反映在 MediaStreamTrack 上,而启用红眼消除功能则不会。

照片设置和功能

“实时”相机功能和设置通过预览 MediaStreamTrack 进行操作。
MediaStreamTrack.getCapabilities() 返回一个 MediaTrackCapabilities对象,包含具体支持的功能和范围或允许值。例如 支持的变焦范围或允许的白平衡模式。 相应地,MediaStreamTrack.getSettings() 返回具有具体当前设置的 MediaTrackSettings。 缩放、亮度和手电筒模式等,例如:

var zoomSlider = document.querySelector('input[type=range]');
// ...获取元素
const capabilities = mediaStreamTrack.getCapabilities();
const settings = mediaStreamTrack.getSettings();
if (capabilities.zoom) {
  // 获取zoom级别
    zoomSlider.min = capabilities.zoom.min;
    zoomSlider.max = capabilities.zoom.max;
    zoomSlider.step = capabilities.zoom.step;
    zoomSlider.value = settings.zoom;
}

“非实时”相机功能和设置通过 ImageCapture 对象进行操作:
ImageCapture.getPhotoCapabilities() 返回一个 PhotoCapabilities 对象,该对象提供对“非实时”可用相机功能的访问。

var widthSlider = document.querySelector('input[type=range]');
// 获取目标DOM
imageCapture.getPhotoCapabilities()
    .then(function(photoCapabilities) {
  // 获取photoCapabilities
    widthSlider.min = photoCapabilities.imageWidth.min;
    widthSlider.max = photoCapabilities.imageWidth.max;
    widthSlider.step = photoCapabilities.imageWidth.step;
    return imageCapture.getPhotoSettings();
    })
    .then(function(photoSettings) {
        widthSlider.value = photoSettings.imageWidth;
    })
    .catch(error => console.error('Error getting camera capabilities and settings:', error));

“实时”相机设置可以通过 MediaStreamTrack 的 ApplyConstraints() constraints 配置,例如:

//applyConstraints设置实时属性
var zoomSlider = document.querySelector('input[type=range]');
mediaStreamTrack.applyConstraints({ advanced: [{ zoom: zoomSlider.value }]})
    .catch(error => console.error('Uh, oh, applyConstraints() error:', error));

“非实时”相机设置使用 takePhoto() 的可选 PhotoSettings 字典进行配置,例如:

var widthSlider = document.querySelector('input[type=range]');
//takePhoto方法参数设置非实时属性
imageCapture.takePhoto({ imageWidth : widthSlider.value })
    .then(blob => {
    img.src = URL.createObjectURL(blob);
    img.onload = () => { URL.revokeObjectURL(this.src); }
    })
    .catch(error => console.error('Uh, oh, takePhoto() error:', error));

4.ImageCapture的浏览器支持与polyfill

如下图所示,Chrome从59版本、Edge从79版本开始已经支持ImageCapture,Firefox从35版本开始也作为试验属性添加。Safari依然是特例,即使最新的16.3版本也没有支持这个属性。

 

整体来看,浏览器支持大约75.06%。不可以可幸的是,对于不支持的浏览器来说google Chrome实验室提供了ImageCapture的polyfill,只需要按照如下方式集成项目即可。

npm install --save image-capture

安装项目后就可以直接在JS中使用:

let videoDevice;
let canvas = document.getElementById('canvas');
let photo = document.getElementById('photo');
navigator.mediaDevices.getUserMedia({video: true}).then(gotMedia).catch(failedToGetMedia);
function gotMedia(mediaStream) {
  // Extract video track.
  videoDevice = mediaStream.getVideoTracks()[0];
  // Check if this device supports a picture mode...
  let captureDevice = new ImageCapture(videoDevice);
  if (captureDevice) {
    captureDevice.takePhoto().then(processPhoto).catch(stopCamera);
    captureDevice.grabFrame().then(processFrame).catch(stopCamera);
  }
}
function processPhoto(blob) {
  photo.src = window.URL.createObjectURL(blob);
}
// 绘制到Canvas中
function processFrame(imageBitmap) {
  canvas.width = imageBitmap.width;
  canvas.height = imageBitmap.height;
  canvas.getContext('2d').drawImage(imageBitmap, 0, 0);
}
function stopCamera(error) {
  console.error(error);
  if (videoDevice) videoDevice.stop();  // turn off the camera
}
photo.addEventListener('load', function () {
  // 图片加载完成后,丢弃图片对象释放内存
  window.URL.revokeObjectURL(this.src);
});

5.本文总结

本文主要和大家介绍MediaStream Image Capture API 的 ImageCapture 接口,其提供了从相机或其他摄影设备捕获图像或照片的方法,文章没有就ImageCapture过多的展开。但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。

 

参考资料

https://chromium.googlesource.com/chromium/src/third_party/+/master/blink/renderer/modules/imagecapture/README.md

https://developer.chrome.com/blog/imagecapture/

https://Github.com/GoogleChromeLabs/imagecapture-polyfill

https://webrtc.github.io/samples/src/content/devices/input-output/



Tags:浏览器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
1.什么是ImageCapture?MediaStream Image Capture API 的 ImageCapture 接口提供了从相机或其他摄影设备捕获图像或照片的方法。 它提供了一个接口,用于从通过有效的 MediaStr...【详细内容】
2023-05-22  Tags: 浏览器  点击:(0)  评论:(0)  加入收藏
近日,Chrome 支持了 WebGPU,新的 WebGPU API 在图形和机器学习工作负载方面实现了巨大的性能提升。本文将探讨 WebGPU 如何改进当前 WebGL 解决方案,并展望未来的发展方向。Web...【详细内容】
2023-05-17  Tags: 浏览器  点击:(19)  评论:(0)  加入收藏
有时候edge浏览器太卡,想重启下,但又不想关闭正在浏览的一些标签页,那么你可以用这个方法重启edge。打开新标签输入`edge://restart`,回车即可 重启edgeedge就会重启,并重新打开...【详细内容】
2023-04-12  Tags: 浏览器  点击:(7)  评论:(0)  加入收藏
前几讲都在讲SSL证书,这一讲讲一讲浏览器是如何验证SSL证书的,浏览器在CA/浏览器论坛中被定义为SSL证书的Consumer(消费者),什么是消费者?消费者是上帝哦。这就是为何笔者一直在...【详细内容】
2023-03-21  Tags: 浏览器  点击:(45)  评论:(0)  加入收藏
做国外项目,免不了要和环境打交道,即使你做的是所谓的正规如亚马逊,tiktok 项目,但操作上依然少不了批量测试这个必须掌握的手法,日常中,大家对 IP 应该是最熟悉的了,知道要看 yout...【详细内容】
2023-03-13  Tags: 浏览器  点击:(47)  评论:(0)  加入收藏
首先是给代码加 Debugger。Debugger 是 JavaScript 中的关键字,用于在代码中设置断点。大家好,我是前端西瓜哥。作为一名前端开发,在浏览一些网页时,有时会在意一些交互效果的实...【详细内容】
2023-03-06  Tags: 浏览器  点击:(44)  评论:(0)  加入收藏
默认问题可能是浏览器之间差异的最常见原因。使用 HTML 和 CSS 时,通常会遇到同一个 Web 应用程序的特定于浏览器的问题。因此,有必要开发特定于浏览器的 CSS 代码以确保无缝...【详细内容】
2023-03-01  Tags: 浏览器  点击:(51)  评论:(0)  加入收藏
手机和电脑上的弹窗广告问题一直引起社会各界的关注,部分弹窗广告甚至还存在着木马植入、信息诈骗和强制消费等安全隐患问题。据央广“中国之声”报道,这些弹窗广告可以根据上...【详细内容】
2023-02-28  Tags: 浏览器  点击:(54)  评论:(0)  加入收藏
Edge浏览器兼容性设置是一项非常重要且实用的功能技巧,可以帮助小伙伴更好地访问那些需要特定浏览器设置或版本的网站和应用程序。在本文中,小编将简要介绍如何使用Edge浏览器...【详细内容】
2023-02-23  Tags: 浏览器  点击:(66)  评论:(0)  加入收藏
有时使用win11浏览器打开某些网页,却出现无法访问的情况,这是因为浏览器没有设置为兼容模式,很多用户都不会进行设置。那么win11浏览器兼容模式怎么设置呢?下面小编来告诉你设...【详细内容】
2023-02-10  Tags: 浏览器  点击:(88)  评论:(0)  加入收藏
▌简易百科推荐
在电脑的D盘创建一个文件夹如“github”来保存stable-diffusion-webui库文件,进入该文件夹后,右键鼠标在打开的下拉列表中选择“在终端中打开”即可在Windows PowerShell中打...【详细内容】
2023-05-24  运维开发故事  微信公众号  Tags:   点击:(2)  评论:(0)  加入收藏
1.什么是ImageCapture?MediaStream Image Capture API 的 ImageCapture 接口提供了从相机或其他摄影设备捕获图像或照片的方法。 它提供了一个接口,用于从通过有效的 MediaStr...【详细内容】
2023-05-22  高级前端进阶  今日头条  Tags:浏览器   点击:(0)  评论:(0)  加入收藏
行号操作::set nu设置行号:set nonu取消行号退出vi::q!强制退出,不保存:wq保存退出光标移动:w移动到单词尾部b移动到单词首部3w移动到后面第3个单词尾部3b移动到前面第3个单词首...【详细内容】
2023-05-18  玩转Linux与MySQL  今日头条  Tags:vi   点击:(14)  评论:(0)  加入收藏
用过电脑办公的小伙伴应该都知道,一旦电脑用的时间一长、文件积累一多,想要找到以往的文件可以说是海底捞针。安装包、图片、视频、文档等各种文件如果不做好放置文件夹,难免让...【详细内容】
2023-05-18    雷科技  Tags:搜索   点击:(14)  评论:(0)  加入收藏
事情说来话长咱们就长话多说。最近这阵子固态硬盘不是迎来了大跳水,所以咱们编辑部有不少同事都入手了固态硬盘,而我也是入手了三条不同品牌的固态硬盘。抛开已经装机的两条固...【详细内容】
2023-05-18  世超  差评公众号  Tags:软件   点击:(14)  评论:(0)  加入收藏
近日,Chrome 支持了 WebGPU,新的 WebGPU API 在图形和机器学习工作负载方面实现了巨大的性能提升。本文将探讨 WebGPU 如何改进当前 WebGL 解决方案,并展望未来的发展方向。Web...【详细内容】
2023-05-17    前端充电宝  Tags:WebGPU   点击:(19)  评论:(0)  加入收藏
是否经常遇到“XXX撤回了一条消息”而刚好撤回的消息是想看又没看完的?在电脑上想同时开多个微信/QQ之类的聊天软件?一个工具通通搞定。这里分享一个针对电脑版的微信、QQ、TI...【详细内容】
2023-05-17  山城科技峰    Tags:微信   点击:(3)  评论:(0)  加入收藏
我们经常需要配置机器之间互相免密,其实配置很简单,但有时候会由于不细心,浪费了不少时间。配置A主机和B主机免密操作步骤:A主机操作:1.ssh-keygen -t rsa -f /root/.ssh/id_rsa...【详细内容】
2023-05-12  玩转Linux与MySQL    Tags:ssh   点击:(10)  评论:(0)  加入收藏
对于学习建筑设计的学生和从事建筑设计的工作者来说,DWG文件格式是一个非常常见的文件格式,并且Atobe CAD也是一个每天低头不见抬头见的常用图纸制作软件,但是这类专业软件所涵...【详细内容】
2023-05-09  城西往事    Tags:CAD   点击:(21)  评论:(0)  加入收藏
软件介绍DW(Dreamweaver)是Adobe公司开发的一款网页设计和开发工具,集成了代码编辑器和可视化设计工具,旨在帮助用户创建各种类型的网站和Web应用程序。它支持多种网页设计语言,...【详细内容】
2023-05-09  兰兰要努力变强    Tags:Dreamweaver   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条