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

聊聊浏览器最新特性 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:浏览器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
微软 Edge 浏览器将迎来“内存限制器”功能,用户可自主控制 Edge 内存占用
IT之家 3 月 28 日消息,微软即将为其 Edge 浏览器带来一项实用新功能,据悉该公司正在测试一项内置的内存限制器,这项功能可以让用户限制 Edge 所占用的内存,防止浏览器超出内存...【详细内容】
2024-03-29  Search: 浏览器  点击:(14)  评论:(0)  加入收藏
GitHub顶流"Web OS"——运行于浏览器的桌面操作系统、用户超100万、原生jQuery和JS编写
Puter 是近日在 GitHub 上最受欢迎的一款开源项目,正式开源还没到一周 ——star 数就已接近 7k。作者表示这个项目已开发 3 年,并获得了超过 100 万用户。根据介绍,P...【详细内容】
2024-03-10  Search: 浏览器  点击:(17)  评论:(0)  加入收藏
微软Edge浏览器新功能:手机上传 配对设备直接传文件
2月21日,微软最新的稳定版本Edge浏览器在Windows 11/10端加入了“手机上传”功能。这一功能允许用户直接从移动设备上上传文件,适用于所有网站,并且没有文件格式限制。要使用这...【详细内容】
2024-02-21  Search: 浏览器  点击:(131)  评论:(0)  加入收藏
腾讯QQ浏览器工具权益卡上线PC端,每月最低6元
IT之家 1 月 29 日消息,腾讯 QQ 浏览器此前在手机端上线工具权益卡,现将部分权益适用范围拓展至 PC 端,每月 10 元,连续包月为 6 元。开通后用户可以在 QQ 浏览器软件内享有由腾...【详细内容】
2024-01-29  Search: 浏览器  点击:(76)  评论:(0)  加入收藏
苹果Safari浏览器如何快速清理缓存?只需简单两步,轻松解决!
Safari是一款由苹果公司开发的多功能浏览器,以其快速、稳定和安全而受到用户的青睐。在我们使用Safari时,它会产生大量的缓存文件。这些缓存文件会占用存储空间,影响设备的运行...【详细内容】
2024-01-17  Search: 浏览器  点击:(81)  评论:(0)  加入收藏
微软 Edge 浏览器支持双引擎同时搜索功能,便利与槽点并存
IT之家 1 月 15 日消息,微软广告和网络服务部门首席执行官 Mikhail Parakhin 近日透露了一个微软 Edge 浏览器的隐藏功能:双引擎同时搜索。顾名思义,该功能允许用户同时使用两...【详细内容】
2024-01-16  Search: 浏览器  点击:(61)  评论:(0)  加入收藏
你用的哪个!全球浏览器份额一览:Chrome遥遥领先、微软新高苹果暴跌
快科技1月1日消息,Statcounter的调查报告显示,目前全球第一的浏览器仍然是Chrome,而微软也取得不错的成绩。Google Chrome仍然是大多数台式电脑用户的首选浏览器。它的市场份额...【详细内容】
2024-01-02  Search: 浏览器  点击:(56)  评论:(0)  加入收藏
Chameleon 恶意木马曝光,伪装成谷歌 Chrome 浏览器等应用
IT之家 12 月 26 日消息,安全公司 Threat Fabric 日前曝光了一款名为“Chameleon”的恶意木马,该木马通常伪装成谷歌 Chrome 浏览器及部分银行应用,安装后便会在后台持续录制受...【详细内容】
2023-12-26  Search: 浏览器  点击:(90)  评论:(0)  加入收藏
谷歌浏览器扩展程序位置介绍
有很多朋友还不知道谷歌浏览器扩展程序在哪,所以下面小编就讲解了谷歌浏览器扩展程序的位置介绍,有需要的小伙伴赶紧来看一下吧,相信对大家一定会有所帮助哦。谷歌浏览器扩展程...【详细内容】
2023-12-25  Search: 浏览器  点击:(60)  评论:(0)  加入收藏
谷歌浏览器开启阅读模式的方法
很多小伙伴不知道谷歌浏览器在哪开启阅读模式,所以下面小编就分享了谷歌浏览器开启阅读模式的方法,一起跟着小编来看看吧,相信对大家会有帮助。谷歌浏览器在哪开启阅读模式?1、...【详细内容】
2023-12-25  Search: 浏览器  点击:(110)  评论:(0)  加入收藏
▌简易百科推荐
如何在Windows 10中查看电脑的名称?这里提供详细步骤
你想在有多台计算机组成的网络上查找你的计算机吗?一种方法是找到你的电脑名称,然后在网络上匹配该名称。下面是如何在Windows 10中使用图形和命令行方法查看你的计算机名称。...【详细内容】
2024-04-10  驾驭信息纵横科技    Tags:Windows 10   点击:(2)  评论:(0)  加入收藏
移动版 Outlook 解锁新技能,可验证登录 OneDrive 等微软服务
IT之家 4 月 9 日消息,微软公司近日发布新闻稿,宣布用户可以使用 Outlook 手机应用,轻松登录 Teams、OneDrive、Microsoft 365 以及 Windows 等微软账号服务。移动端 Outlook...【详细内容】
2024-04-09    IT之家  Tags:Outlook   点击:(0)  评论:(0)  加入收藏
Win10/Win11和 macOS用户反馈:谷歌云服务“捆绑”系统 DNS 设置
IT之家 4 月 6 日消息,谷歌公司承认旗下的 Google One 订阅服务中存在问题,在 Windows 10、Windows 11 以及 macOS 系统上会更改系统 DNS 设置,变更为 8.8.8.8 地址。Google On...【详细内容】
2024-04-08    IT之家  Tags:Win10   点击:(7)  评论:(0)  加入收藏
电脑卡顿怎么重装系统,快看这篇
电脑卡顿时,重装系统确实是一种可能的解决方案。以下是重装系统的详细步骤:备份重要数据:首先,你需要将电脑中的重要文件和数据备份到外部存储设备(如U盘、移动硬盘或云存储)中,以...【详细内容】
2024-04-04  科技数码前锋    Tags:重装系统   点击:(2)  评论:(0)  加入收藏
如何检查电脑的最近历史记录?这里提供详细步骤
如果你怀疑有人在使用你的计算机,并且你想查看他们在做什么,下面是如何查看是否有访问内容的痕迹。如何检查我的计算机的最近历史记录要检查计算机的最近历史记录,应该从web浏...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:历史记录   点击:(0)  评论:(0)  加入收藏
关于Windows中AppData的相关知识,看这篇文章就可以了
如果AppData文件夹占用了你电脑上的太多空间,则需要清理AppData文件夹。下面是一些帮助你在Windows计算机上进行AppData清理的方法。什么是AppData文件夹AppData文件夹是保存...【详细内容】
2024-03-30  驾驭信息纵横科技    Tags:AppData   点击:(2)  评论:(0)  加入收藏
微软 Edge 浏览器将迎来“内存限制器”功能,用户可自主控制 Edge 内存占用
IT之家 3 月 28 日消息,微软即将为其 Edge 浏览器带来一项实用新功能,据悉该公司正在测试一项内置的内存限制器,这项功能可以让用户限制 Edge 所占用的内存,防止浏览器超出内存...【详细内容】
2024-03-29    IT之家  Tags:Edge   点击:(14)  评论:(0)  加入收藏
一寸照片的大小如何压缩?四个实测效果很好的方法
一寸照片作为生活中常见的尺寸之一,常用于各类证件照与证明文件的制作。然而,受限于其较为狭小的尺寸,上传及打印过程中很容易出现尺寸超限的情况。所以,这个时候就需要对其体积...【详细内容】
2024-03-18  宠物小阿涛    Tags:压缩   点击:(14)  评论:(0)  加入收藏
手机投屏到电脑/电视的方法
方法一:Win10自带的投影功能1、将手机和电脑连接同一个无线网络。2、选择【开始】>【设置】>【系统】>【投影到此电脑】3、将默认的始终关闭的选项更改为所有位置都可用。4、...【详细内容】
2024-03-18    老吴讲I  Tags:投屏   点击:(16)  评论:(0)  加入收藏
微软商店怎么卸载应用 一分钟快速看懂!
微软商店怎么卸载应用 一分钟快速看懂!微软公司(Microsoft Corporation)是一家全球领先的科技企业,总部位于美国华盛顿州的雷德蒙德。成立于1975年,由比尔·盖茨和保罗&mid...【详细内容】
2024-02-27  婷婷说体育    Tags:微软商店   点击:(36)  评论:(0)  加入收藏
站内最新
站内热门
站内头条