成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Day19 - 攝像、拍照,濾鏡中文指南

chaos_G / 1854人閱讀

摘要:攝像拍照,濾鏡中文指南本文出自春哥個人博客作者黎躍春追時間的人簡介是推出的一個天挑戰(zhàn)。完整中文版指南及視頻教程在從零到壹全棧部落。這個新的對象表示指定的對象或?qū)ο蟆?/p>

Day19 - 攝像、拍照,濾鏡中文指南

本文出自:春哥個人博客
作者:?黎躍春-追時間的人
簡介:JavaScript30 是 Wes Bos 推出的一個 30 天挑戰(zhàn)。項目免費提供了 30 個視頻教程、30 個挑戰(zhàn)的起始文檔和 30 個挑戰(zhàn)解決方案源代碼。目的是幫助人們用純 JavaScript 來寫東西,不借助框架和庫,也不使用編譯器和引用?,F(xiàn)在你看到的是這系列指南的第 19 篇。完整中文版指南及視頻教程在 從零到壹全棧部落。

效果圖


JS30天第19天挑戰(zhàn)的是如何調(diào)用攝像頭錄像、播放,如何捕捉視頻將其繪制canvas,還有拍照,以及濾鏡的制作。

運行項目

通過npm install安裝依賴包

通過npm start啟動服務(wù)器

瀏覽器直接訪問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

> [email protected] 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 [email protected] No repository field.

added 411 packages in 5.921s
liyuechun:19 - Webcam Fun yuechunli$ npm start

> [email protected] 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...
主要思路

獲取到瀏覽器的攝像頭的影像

將影像的記錄導(dǎo)出到canvas中

通過獲取canvas中的圖片信息,對圖片添加濾鏡

Browsersync 項目結(jié)構(gòu)

了解Browsersync

省時的瀏覽器同步測試工具,Browsersync能讓瀏覽器實時、快速響應(yīng)您的文件更改(html、js、css、sass、less等)并自動刷新頁面。更重要的是Browsersync可以同時在PC、平板、手機等設(shè)備下進項調(diào)試。您可以想象一下:“假設(shè)您的桌子上有pc、ipad、iphone、android等設(shè)備,同時打開了您需要調(diào)試的頁面,當您使用browsersync后,您的任何一次代碼保存,以上的設(shè)備都會同時顯示您的改動”。無論您是前端還是后端工程師,使用它將提高您30%的工作效率。

有了它,您不用在多個瀏覽器、多個設(shè)備間來回切換,頻繁的刷新頁面。更神奇的是您在一個瀏覽器中滾動頁面、點擊等行為也會同步到其他瀏覽器和設(shè)備中,這一切還可以通過可視化界面來控制。

獲取影像
function getVideo(){
    navigator.mediaDevices.getUserMedia({video:true,audio:false})
        .then(videostream => {
            console.log(videostream);
            video.src = URL.createObjectURL(videostream); // 創(chuàng)建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()方法提示用戶允許使用一個視頻和/或一個音頻輸入設(shè)備,例如相機或屏幕共享和/或麥克風。如果用戶給予許可,就返回一個Promise對象,MediaStream對象作為此Promise對象的Resolved[成功]狀態(tài)的回調(diào)函數(shù)參數(shù),相應(yīng)的,如果用戶拒絕了許可,或者沒有媒體可用的情況下,PermissionDeniedError或者NotFoundError作為此PromiseRejected[失?。轄顟B(tài)的回調(diào)函數(shù)參數(shù)。注意,由于用戶不會被要求必須作出允許或者拒絕的選擇,所以返回的Promise對象可能既不會觸發(fā)resolve也不會觸發(fā)reject

URL.createObjectURL()。

URL.createObjectURL() 靜態(tài)方法會創(chuàng)建一個DOMString,其中包含一個表示參數(shù)中給出的對象的URL。這個URL 的生命周期和創(chuàng)建它的窗口中的document 綁定。這個新的URL對象表示指定的File 對象或Blob 對象。

canvas繪圖
function printToCanvas(){
    let width = video.videoWidth;
    let height = video.videoHeight;
    canvas.height = height;
    canvas.width = width; // 勿忘:設(shè)置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()

它能夠?qū)斍暗囊曨l流(video)中的一幀畫在canvas中。

getImageData()

ctx.getImageData()返回一個ImageData對象,用來描述canvas區(qū)域隱含的像素數(shù)據(jù),這個區(qū)域通過矩形表示,起始點為(sx, sy)、寬為sw、高為sh。

putImageData()

ctx.putImageData():該方法是 Canvas 2D API 將數(shù)據(jù)從已有的 ImageData 對象繪制到位圖的方法。 如果提供了臟矩形,只能繪制矩形的像素。

imagedata信息

imagedata中有大量的數(shù)據(jù),其中分別代表了圖片的顏色信息,分別為red,green,blue,alpha的值,因此我們可以同添加自定義濾鏡,通過改變顏色的rgba的值,控制頁面的效果。

攝像記錄導(dǎo)出到canvas中
function takePhoto(){
    // 播放音效
    snap.currentTime = 0;
    snap.play();
    
    // 獲取圖像數(shù)據(jù)
    let data = canvas.toDataURL("image/jpeg");
    // console.log(data);
    let link = document.createElement("a");
    link.href = data;
    link.setAttribute("downlond","handsome");
    link.innerHTML = `handsome`
    strip.insertBefore(link,strip.firstChild);
}

在沒次點擊照相的時候,都要求播一遍音效,并且為了模擬現(xiàn)實情況,我們在用戶點擊時,設(shè)置當前的播放時間為0,再播放音效。

canvas.toDataURL("image/jpeg");方法返回一個包含圖片展示的 data URI ??梢允褂?type 參數(shù)其類型,默認為 PNG 格式。圖片的分辨率為96dpi。

接下來新建一個a元素,設(shè)置其href的值為data。在插入在文檔中。實現(xiàn)截圖成功的效果。

自定義濾鏡
// 紅色特效濾鏡
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的值,因此我們添加濾鏡的原理也是這樣,通過循環(huán)改變一張圖片中的所有rgba的值即可。

源碼下載

Github Source Code

全棧部落 區(qū)塊鏈部落

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87151.html

相關(guān)文章

  • getUserMedia API及HTML5 調(diào)用手機攝像拍照

    摘要:失敗回調(diào)函數(shù)的參數(shù),可能的異常有硬件問題用戶拒絕了當前的瀏覽器實例的訪問請求或者用戶拒絕了當前會話的訪問或者用戶在全局范圍內(nèi)拒絕了所有媒體訪問請求。 getUserMedia API簡介 HTML5的getUserMedia API為用戶提供訪問硬件設(shè)備媒體(攝像頭、視頻、音頻、地理位置等)的接口,基于該接口,開發(fā)者可以在不依賴任何瀏覽器插件的條件下訪問硬件媒體設(shè)備。 getUserM...

    xiaokai 評論0 收藏0
  • getUserMedia API及HTML5 調(diào)用手機攝像拍照

    摘要:失敗回調(diào)函數(shù)的參數(shù),可能的異常有硬件問題用戶拒絕了當前的瀏覽器實例的訪問請求或者用戶拒絕了當前會話的訪問或者用戶在全局范圍內(nèi)拒絕了所有媒體訪問請求。 getUserMedia API簡介 HTML5的getUserMedia API為用戶提供訪問硬件設(shè)備媒體(攝像頭、視頻、音頻、地理位置等)的接口,基于該接口,開發(fā)者可以在不依賴任何瀏覽器插件的條件下訪問硬件媒體設(shè)備。 getUserM...

    李增田 評論0 收藏0
  • Day07 - Array Cardio 中文指南

    摘要:中文指南二作者簡介是推出的一個天挑戰(zhàn)。完整中文版指南及視頻教程在從零到壹全棧部落。第七天的練習(xí)是接著之前中文指南一的練習(xí),繼續(xù)熟練數(shù)組的方法,依舊沒有頁面顯示效果,所以請打開瀏覽器的面板進行調(diào)試運行。 Day07 - Array Cardio 中文指南二 作者:?liyuechun 簡介:JavaScript30 是 Wes Bos 推出的一個 30 天挑戰(zhàn)。項目免費提供了 30 個...

    Forest10 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<