Day19 - 摄像、拍照,滤镜中文指南

本文出自:春哥个人博客
作者:©黎跃春-追时间的人
简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。现在你看到的是这系列指南的第 19 篇。完整中文版指南及视频教程在 从零到壹全栈部落。

效果图


JS30天第19天挑战的是如何调用摄像头录像、播放,如何捕捉视频将其绘制canvas,还有拍照,以及滤镜的制作。

运行项目

  1. 通过npm install安装依赖包
  2. 通过npm start启动服务器
  3. 浏览器直接访问http://localhost:3000
liyuechun:19 - Webcam Fun yuechunli$ pwd
/Users/liyuechun/Documents/js30/JavaScript30-liyuechun/19 - Webcam Fun
liyuechun:19 - Webcam Fun yuechunli$ ls
README.md       package-lock.json   scripts.js
index.html      package.json        style.css
liyuechun:19 - Webcam Fun yuechunli$ npm install> fsevents@1.1.2 install /Users/liyuechun/Documents/js30/JavaScript30-liyuechun/19 - Webcam Fun/node_modules/fsevents
> node install[fsevents] Success: "/Users/liyuechun/Documents/js30/JavaScript30-liyuechun/19 - Webcam Fun/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node" already installed
Pass --update-binary to reinstall or --build-from-source to recompile
npm WARN gum@1.0.0 No repository field.added 411 packages in 5.921s
liyuechun:19 - Webcam Fun yuechunli$ npm start> gum@1.0.0 start /Users/liyuechun/Documents/js30/JavaScript30-liyuechun/19 - Webcam Fun
> browser-sync start --server --files '*.css, *.html, *.js'[Browsersync] Access URLs:--------------------------------------Local: http://localhost:3000External: http://192.168.1.116:3000--------------------------------------UI: http://localhost:3001UI External: http://192.168.1.116:3001--------------------------------------
[Browsersync] Serving files from: ./
[Browsersync] Watching files...

主要思路

  • 获取到浏览器的摄像头的影像
  • 将影像的记录导出到canvas中
  • 通过获取canvas中的图片信息,对图片添加滤镜

Browsersync

项目结构

了解Browsersync

省时的浏览器同步测试工具,Browsersync能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less等)并自动刷新页面。更重要的是Browsersync可以同时在PC、平板、手机等设备下进项调试。您可以想象一下:“假设您的桌子上有pc、ipad、iphone、android等设备,同时打开了您需要调试的页面,当您使用browsersync后,您的任何一次代码保存,以上的设备都会同时显示您的改动”。无论您是前端还是后端工程师,使用它将提高您30%的工作效率。

有了它,您不用在多个浏览器、多个设备间来回切换,频繁的刷新页面。更神奇的是您在一个浏览器中滚动页面、点击等行为也会同步到其他浏览器和设备中,这一切还可以通过可视化界面来控制。

获取影像

function getVideo(){navigator.mediaDevices.getUserMedia({video:true,audio:false}).then(videostream => {console.log(videostream);video.src = URL.createObjectURL(videostream); // 创建url(creates  a URL for the specified object)video.play();}).catch((err) => {console.error('OH,Don\'t have permission to use your local cam!',err);});
}
  • MediaDevices.getUserMedia()

    MediaDevices.getUserMedia()方法提示用户允许使用一个视频和/或一个音频输入设备,例如相机或屏幕共享和/或麦克风。如果用户给予许可,就返回一个Promise对象,MediaStream对象作为此Promise对象的Resolved[成功]状态的回调函数参数,相应的,如果用户拒绝了许可,或者没有媒体可用的情况下,PermissionDeniedError或者NotFoundError作为此PromiseRejected[失败]状态的回调函数参数。注意,由于用户不会被要求必须作出允许或者拒绝的选择,所以返回的Promise对象可能既不会触发resolve也不会触发reject

  • URL.createObjectURL()。

    URL.createObjectURL() 静态方法会创建一个DOMString,其中包含一个表示参数中给出的对象的URL。这个URL 的生命周期和创建它的窗口中的document 绑定。这个新的URL对象表示指定的File 对象或Blob 对象。

canvas绘图

function printToCanvas(){let width = video.videoWidth;let height = video.videoHeight;canvas.height = height;canvas.width = width; // 勿忘:设置canvas的宽和高console.log(width,height);return setInterval(() => {ctx.drawImage(video,0,0,width,height);// get the image datalet imagedata = ctx.getImageData(0,0,width,height);// console.log(imagedata.data);// mess the image data// imagedata = redEffect(imagedata);// imagedata = rgbsplit(imagedata);// ctx.globalAlpha = 0.2;imagedata = greenScreen(imagedata);// put the image data backctx.putImageData(imagedata,0,0);},16);
}
  • ctx.drawImage()

    它能够将当前的视频流(video)中的一帧画在canvas中。

  • getImageData()

    ctx.getImageData()返回一个ImageData对象,用来描述canvas区域隐含的像素数据,这个区域通过矩形表示,起始点为(sx, sy)、宽为sw、高为sh。

  • putImageData()

    ctx.putImageData():该方法是 Canvas 2D API 将数据从已有的 ImageData 对象绘制到位图的方法。 如果提供了脏矩形,只能绘制矩形的像素。

  • imagedata信息

    imagedata中有大量的数据,其中分别代表了图片的颜色信息,分别为red,green,blue,alpha的值,因此我们可以同添加自定义滤镜,通过改变颜色的rgba的值,控制页面的效果。

摄像记录导出到canvas中

function takePhoto(){// 播放音效snap.currentTime = 0;snap.play();// 获取图像数据let data = canvas.toDataURL('image/jpeg');// console.log(data);let link = document.createElement('a');link.href = data;link.setAttribute('downlond','handsome');link.innerHTML = `<img src=${data} alt=handsome>`strip.insertBefore(link,strip.firstChild);
}
  • 在没次点击照相的时候,都要求播一遍音效,并且为了模拟现实情况,我们在用户点击时,设置当前的播放时间为0,再播放音效。
  • canvas.toDataURL(‘image/jpeg’);方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi。
  • 接下来新建一个a元素,设置其href的值为data。在插入在文档中。实现截图成功的效果。

自定义滤镜

// 红色特效滤镜
function redEffect(imagedata){for(let i = 0;i<imagedata.data.length;i+=4){imagedata.data[i + 0] += 200; // redimagedata.data[i + 1] -= 50; // greenimagedata.data[i + 2] *= 0.5; // blue}return imagedata;
}// RGB分离
function rgbsplit(imagedata){for(let i = 0;i<imagedata.data.length;i+=4){imagedata.data[i - 100] = imagedata.data[i + 0]; // redimagedata.data[i + 150] = imagedata.data[i + 1]; // greenimagedata.data[i - 150] = imagedata.data[i + 2]; // blue}return imagedata;
}// 绿屏(部分消失)
function greenScreen(imagedata) {const levels = {};document.querySelectorAll('.rgb input').forEach((input) => {levels[input.name] = input.value;});for (i = 0; i < pixels.data.length; i = i + 4) {red = imagedata.data[i + 0];green = imagedata.data[i + 1];blue = imagedata.data[i + 2];alpha = imagedata.data[i + 3];if (red >= levels.rmin&& green >= levels.gmin&& blue >= levels.bmin&& red <= levels.rmax&& green <= levels.gmax&& blue <= levels.bmax) {// take it out!imagedata.data[i + 3] = 0;}}return imagedata;
}

这部分主要定义了三个滤镜,由于我们通过ctx.getImageData可以获取到页面颜色的rgba的值,因此我们添加滤镜的原理也是这样,通过循环改变一张图片中的所有rgba的值即可。

源码下载

Github Source Code

全栈部落 区块链部落

Day19 - 摄像、拍照,滤镜中文指南相关推荐

  1. biopython中文指南_Biopython新手指南-第1部分

    biopython中文指南 When you hear the word Biopython what is the first thing that came to your mind? A pyt ...

  2. 苹果应用商店AppStore审核中文指南(译本)

    原始地址:http://www.dapps.net/market/appstore/apple-app-store-review-chinese-guidelines.html 前言 相关的文章推荐: ...

  3. 2013-03-05 By dapps  苹果应用商店AppStore审核中文指南(译本)

    前言 原始链接:http://www.dapps.net/market/appstore/apple-app-store-review-chinese-guidelines.html 相关的文章推荐: ...

  4. 伪官宣:Envoy 中文指南新鲜出炉

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前言 Envoy 是专为大型现代 SOA(面向服务架构) ...

  5. Android 短视频拍摄、拍照滤镜 第三方库SDK

    视频 1.趣拍云服务 http://vcs.qupai.me/ 拍照 1.camera360 SDk 拍照滤镜 http://www.camera360.com/ 2 .凃图 http://tusdk ...

  6. 最新历史版本 :LINUX KERNEL 配置编译中文指南

    LINUX KERNEL 配置编译中文指南 序言 近几年,linux大行其道,令不满windows蓝屏的使用者跃跃欲试,结果发现linux安装不及windows方便,界面不及windows友好,配置不 ...

  7. MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南

    MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库. 有关 MySQL 远程管理软件,你可以选择 ...

  8. HTML5视频教程,HTML5项目实战,HTML5中文指南,HTML5使用手册

    HTML5视频教程,HTML5项目实战,HTML5中文指南,HTML5使用手册. 超过2G 的 HTML5 视频教程免费分享,免费下载! 尚硅谷前端HTML5视频_HTML & CSS 核心基 ...

  9. Google Guava 中文指南

    温馨提示:Guava 中文指南的 GitHub 地址为「guava-guide」,欢迎大家Star.Fork,纠错. Guava 中文指南 Guava 项目包含若干被 Google 的 Java 项目 ...

最新文章

  1. Android图形子系统
  2. 【BLE】TLSR8258开发记录之10--更改MTU为245
  3. WebService部署时提示:HTTP错误 404.3-Not Found,如果该页面是脚本,请添加处理程序,如果应下载文件,请添加MIME映射
  4. “指标预警”新功能上线,智能实现数据监测
  5. url decode problem
  6. 深入一点 让细节帮你和Fragment更熟络
  7. 复旦nlp实验室 nlp-beginner 任务二:基于深度学习的文本分类
  8. nekohtml资料
  9. Ubuntu Kvm USB重定向问题解决
  10. 宁波市重点首版次软件认定申报,区块链可申请 | 产业区块链发展周报
  11. 如何让计算机系统恢复默认字体,Win10修改系统字体后怎么还原系统默认字体?
  12. 史上最全自媒体推广工具
  13. C++ ISBN 号码
  14. html5 paint,html5实现仿windows画图工具的画图工具jspaint
  15. RequestResponse入门1(Request)
  16. 自定义mvc框架复习(crud)
  17. 主流的企业级报表工具,国内报表工具排名前列
  18. 【毕业设计】基于大数据的销量数据预测 -python销量预测 大数据 可视化
  19. Easycwmp_源码分析
  20. 固定收益证券读书笔记(一)

热门文章

  1. 【公告】博客新皮肤上线啦
  2. Lumiprobe核酸定量丨QuDye dsDNA BR 检测试剂盒
  3. python软件-mPython(图形化编程软件) V0.5.0 官方版
  4. C++:实现量化Overnight-indexed swap 隔夜指数掉期测试实例
  5. 麻雀租房App 作品展示
  6. 贴片元件的封装中名字后缀的L、N、M的含义
  7. 初识搜索引擎 —— ElasticSearch
  8. PS怎么快速把多个图层形状以中心点缩放
  9. LeetCode 805数组切割题目
  10. 查看网站服务器版本,查看网站为TLS或SSL及其版本