11const video = document . querySelector ( '.player' ) ;
22const canvas = document . querySelector ( '.photo' ) ;
3- const ctx = canvas . getContext ( '2d' ) ;
3+ const ctx = canvas . getContext ( '2d' , { willReadFrequently : true } ) ;
44const strip = document . querySelector ( '.strip' ) ;
55const snap = document . querySelector ( '.snap' ) ;
6+
7+ function getVideo ( ) {
8+ navigator . mediaDevices . getUserMedia ( { video : true , audio : false } )
9+ . then ( localMediaStream => {
10+ console . log ( localMediaStream ) ;
11+ video . srcObject = localMediaStream ;
12+ video . play ( ) ;
13+ } )
14+ . catch ( err => {
15+ console . error ( `OH NO!!` , err ) ;
16+ } ) ;
17+ }
18+
19+ function paintToCanvas ( ) {
20+ const width = video . videoWidth ;
21+ const height = video . videoHeight ;
22+ canvas . width = width ;
23+ canvas . height = height ;
24+
25+ return setInterval ( ( ) => {
26+ ctx . drawImage ( video , 0 , 0 , width , height ) ;
27+ // take the pixels out
28+ let pixels = ctx . getImageData ( 0 , 0 , width , height ) ;
29+ // mess with them
30+ //pixels = redEffect(pixels);
31+
32+ pixels = colorEffect ( pixels ) ;
33+
34+ pixels = rgbSplit ( pixels ) ;
35+ //ctx.globalAlpha = 0.8;
36+
37+ //pixels = greenScreen(pixels);
38+ // put them back
39+ ctx . putImageData ( pixels , 0 , 0 ) ;
40+ } , 16 ) ;
41+ }
42+
43+ function takePhoto ( ) {
44+ // played the sound
45+ snap . currentTime = 0 ;
46+ snap . play ( ) ;
47+
48+ // take the data out of the canvas
49+ const data = canvas . toDataURL ( 'image/jpeg' ) ;
50+ const link = document . createElement ( 'a' ) ;
51+ link . href = data ;
52+ link . setAttribute ( 'download' , 'pretty' ) ;
53+ link . innerHTML = `<img src="${ data } " alt="Pretty Woman" />` ;
54+ strip . insertBefore ( link , strip . firstChild ) ;
55+ }
56+
57+ function redEffect ( pixels ) {
58+ for ( let i = 0 ; i < pixels . data . length ; i += 4 ) {
59+ pixels . data [ i + 0 ] = pixels . data [ i + 0 ] + 200 ; // RED
60+ pixels . data [ i + 1 ] = pixels . data [ i + 1 ] - 50 ; // GREEN
61+ pixels . data [ i + 2 ] = pixels . data [ i + 2 ] * 0.5 ; // Blue
62+ }
63+ return pixels ;
64+ }
65+
66+ function colorEffect ( pixels ) {
67+ const levels = { } ;
68+ document . querySelectorAll ( '.rgb input' ) . forEach ( ( input ) => {
69+ levels [ input . name ] = parseFloat ( input . value ) ;
70+ } ) ;
71+
72+ for ( let i = 0 ; i < pixels . data . length ; i += 4 ) {
73+ pixels . data [ i + 0 ] = pixels . data [ i + 0 ] + levels . rmax - levels . rmin ;
74+ pixels . data [ i + 1 ] = pixels . data [ i + 1 ] + levels . gmax - levels . gmin ;
75+ pixels . data [ i + 2 ] = pixels . data [ i + 2 ] + levels . bmax - levels . bmin ;
76+ }
77+ return pixels ;
78+ }
79+
80+ function rgbSplit ( pixels ) {
81+ for ( let i = 0 ; i < pixels . data . length ; i += 4 ) {
82+ pixels . data [ i - 150 ] = pixels . data [ i + 0 ] + 100 ; // RED
83+ pixels . data [ i + 100 ] = pixels . data [ i + 1 ] - 50 ; // GREEN
84+ pixels . data [ i - 500 ] = pixels . data [ i + 2 ] * 0.5 ; // Blue
85+ }
86+ return pixels ;
87+ }
88+
89+ function greenScreen ( pixels ) {
90+ const levels = { } ;
91+
92+ document . querySelectorAll ( '.rgb input' ) . forEach ( ( input ) => {
93+ levels [ input . name ] = input . value ;
94+ } ) ;
95+
96+ console . log ( levels ) ;
97+
98+ for ( i = 0 ; i < pixels . data . length ; i = i + 4 ) {
99+ red = pixels . data [ i + 0 ] ;
100+ green = pixels . data [ i + 1 ] ;
101+ blue = pixels . data [ i + 2 ] ;
102+ alpha = pixels . data [ i + 3 ] ;
103+
104+ if ( red >= levels . rmin
105+ && green >= levels . gmin
106+ && blue >= levels . bmin
107+ && red <= levels . rmax
108+ && green <= levels . gmax
109+ && blue <= levels . bmax ) {
110+ // take it out!
111+ pixels . data [ i + 3 ] = 0 ;
112+ }
113+ }
114+ return pixels ;
115+ }
116+
117+ getVideo ( ) ;
118+
119+ video . addEventListener ( 'canplay' , paintToCanvas ) ;
0 commit comments