摘要:攝像拍照,濾鏡中文指南本文出自春哥個人博客作者黎躍春追時間的人簡介是推出的一個天挑戰。完整中文版指南及視頻教程在從零到壹全棧部落。這個新的對象表示指定的對象或對象。
Day19 - 攝像、拍照,濾鏡中文指南
效果圖本文出自:春哥個人博客
作者:?黎躍春-追時間的人
簡介:JavaScript30 是 Wes Bos 推出的一個 30 天挑戰。項目免費提供了 30 個視頻教程、30 個挑戰的起始文檔和 30 個挑戰解決方案源代碼。目的是幫助人們用純 JavaScript 來寫東西,不借助框架和庫,也不使用編譯器和引用。現在你看到的是這系列指南的第 19 篇。完整中文版指南及視頻教程在 從零到壹全棧部落。
JS30天第19天挑戰的是如何調用攝像頭錄像、播放,如何捕捉視頻將其繪制canvas,還有拍照,以及濾鏡的制作。
運行項目通過npm install安裝依賴包
通過npm start啟動服務器
瀏覽器直接訪問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:3000 External: http://192.168.1.116:3000 -------------------------------------- UI: http://localhost:3001 UI 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作為此Promise的Rejected[失敗]狀態的回調函數參數。注意,由于用戶不會被要求必須作出允許或者拒絕的選擇,所以返回的Promise對象可能既不會觸發resolve也不會觸發reject。
URL.createObjectURL()。
canvas繪圖URL.createObjectURL() 靜態方法會創建一個DOMString,其中包含一個表示參數中給出的對象的URL。這個URL 的生命周期和創建它的窗口中的document 綁定。這個新的URL對象表示指定的File 對象或Blob 對象。
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 data let 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 back ctx.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信息
攝像記錄導出到canvas中imagedata中有大量的數據,其中分別代表了圖片的顏色信息,分別為red,green,blue,alpha的值,因此我們可以同添加自定義濾鏡,通過改變顏色的rgba的值,控制頁面的效果。
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 = `` 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{ 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
全棧部落 | 區塊鏈部落 |
---|---|
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87151.html
摘要:失敗回調函數的參數,可能的異常有硬件問題用戶拒絕了當前的瀏覽器實例的訪問請求或者用戶拒絕了當前會話的訪問或者用戶在全局范圍內拒絕了所有媒體訪問請求。 getUserMedia API簡介 HTML5的getUserMedia API為用戶提供訪問硬件設備媒體(攝像頭、視頻、音頻、地理位置等)的接口,基于該接口,開發者可以在不依賴任何瀏覽器插件的條件下訪問硬件媒體設備。 getUserM...
摘要:失敗回調函數的參數,可能的異常有硬件問題用戶拒絕了當前的瀏覽器實例的訪問請求或者用戶拒絕了當前會話的訪問或者用戶在全局范圍內拒絕了所有媒體訪問請求。 getUserMedia API簡介 HTML5的getUserMedia API為用戶提供訪問硬件設備媒體(攝像頭、視頻、音頻、地理位置等)的接口,基于該接口,開發者可以在不依賴任何瀏覽器插件的條件下訪問硬件媒體設備。 getUserM...
摘要:中文指南二作者簡介是推出的一個天挑戰。完整中文版指南及視頻教程在從零到壹全棧部落。第七天的練習是接著之前中文指南一的練習,繼續熟練數組的方法,依舊沒有頁面顯示效果,所以請打開瀏覽器的面板進行調試運行。 Day07 - Array Cardio 中文指南二 作者:?liyuechun 簡介:JavaScript30 是 Wes Bos 推出的一個 30 天挑戰。項目免費提供了 30 個...
閱讀 1635·2021-10-09 09:44
閱讀 2769·2021-10-08 10:04
閱讀 2461·2021-09-26 09:55
閱讀 3831·2021-09-22 10:02
閱讀 3304·2019-08-29 17:08
閱讀 1064·2019-08-29 15:08
閱讀 2952·2019-08-26 13:52
閱讀 3267·2019-08-26 13:34