Webcam Fun. Day 19 of 30.
This commit is contained in:
parent
3d05e09841
commit
73fd3627c4
46
Webcam Fun [19-30]/index.html
Normal file
46
Webcam Fun [19-30]/index.html
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Get User Media Code Along!</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<link rel="icon" href="https://fav.farm/🔥" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="photobooth">
|
||||||
|
<div class="controls">
|
||||||
|
<button onClick="takePhoto()">Take Photo</button>
|
||||||
|
<!-- <div class="rgb">
|
||||||
|
<label for="rmin">Red Min:</label>
|
||||||
|
<input type="range" min=0 max=255 name="rmin">
|
||||||
|
<label for="rmax">Red Max:</label>
|
||||||
|
<input type="range" min=0 max=255 name="rmax">
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<label for="gmin">Green Min:</label>
|
||||||
|
<input type="range" min=0 max=255 name="gmin">
|
||||||
|
<label for="gmax">Green Max:</label>
|
||||||
|
<input type="range" min=0 max=255 name="gmax">
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<label for="bmin">Blue Min:</label>
|
||||||
|
<input type="range" min=0 max=255 name="bmin">
|
||||||
|
<label for="bmax">Blue Max:</label>
|
||||||
|
<input type="range" min=0 max=255 name="bmax">
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<canvas class="photo"></canvas>
|
||||||
|
<video class="player"></video>
|
||||||
|
<div class="strip"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<audio class="snap" src="./snap.mp3" hidden></audio>
|
||||||
|
|
||||||
|
<script src="scripts.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
14
Webcam Fun [19-30]/package.json
Normal file
14
Webcam Fun [19-30]/package.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "gum",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "scripts.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "browser-sync start --server --files \"*.css, *.html, *.js\""
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"browser-sync": "^2.12.5 <2.23.2"
|
||||||
|
}
|
||||||
|
}
|
93
Webcam Fun [19-30]/scripts.js
Normal file
93
Webcam Fun [19-30]/scripts.js
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
const video = document.querySelector(".player");
|
||||||
|
const canvas = document.querySelector(".photo");
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
const strip = document.querySelector(".strip");
|
||||||
|
const snap = document.querySelector(".snap");
|
||||||
|
|
||||||
|
function getVideo() {
|
||||||
|
navigator.mediaDevices
|
||||||
|
.getUserMedia({ video: true, audio: false })
|
||||||
|
.then((localMediaStream) => {
|
||||||
|
// console.log(localMediaStream);
|
||||||
|
video.srcObject = localMediaStream;
|
||||||
|
video.play();
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err));
|
||||||
|
}
|
||||||
|
|
||||||
|
function paintToCanvas() {
|
||||||
|
const width = video.videoWidth;
|
||||||
|
const height = video.videoHeight;
|
||||||
|
canvas.width = width;
|
||||||
|
canvas.height = height;
|
||||||
|
|
||||||
|
return setInterval(() => {
|
||||||
|
ctx.drawImage(video, 0, 0, width, height);
|
||||||
|
let pixels = ctx.getImageData(0, 0, width, height);
|
||||||
|
// pixels = rgbSplit(pixels);
|
||||||
|
// ctx.putImageData(pixels, 0, 0);
|
||||||
|
}, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
function takePhoto() {
|
||||||
|
snap.currentTime = 0;
|
||||||
|
snap.play();
|
||||||
|
|
||||||
|
const data = canvas.toDataURL("image/png");
|
||||||
|
const link = document.createElement("a");
|
||||||
|
link.href = data;
|
||||||
|
link.setAttribute("download", "handsome");
|
||||||
|
link.innerHTML = `<img src="${data}" />`;
|
||||||
|
strip.insertBefore(link, strip.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
function redEffect(pixels) {
|
||||||
|
for (let i = 0; i < pixels.data.length; i += 4) {
|
||||||
|
pixels.data[i + 0] = pixels.data[i + 0] + 200; // RED
|
||||||
|
pixels.data[i + 1] = pixels.data[i + 1] - 50; // GREEN
|
||||||
|
pixels.data[i + 2] = pixels.data[i + 2] * 0.5; // Blue
|
||||||
|
}
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
function rgbSplit(pixels) {
|
||||||
|
for (let i = 0; i < pixels.data.length; i += 4) {
|
||||||
|
pixels.data[i - 150] = pixels.data[i + 0]; // RED
|
||||||
|
pixels.data[i + 500] = pixels.data[i + 1]; // GREEN
|
||||||
|
pixels.data[i - 550] = pixels.data[i + 2]; // Blue
|
||||||
|
}
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
function greenScreen(pixels) {
|
||||||
|
const levels = {};
|
||||||
|
|
||||||
|
document.querySelectorAll(".rgb input").forEach((input) => {
|
||||||
|
levels[input.name] = input.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (i = 0; i < pixels.data.length; i = i + 4) {
|
||||||
|
red = pixels.data[i + 0];
|
||||||
|
green = pixels.data[i + 1];
|
||||||
|
blue = pixels.data[i + 2];
|
||||||
|
alpha = pixels.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!
|
||||||
|
pixels.data[i + 3] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
getVideo();
|
||||||
|
|
||||||
|
video.addEventListener("canplay", paintToCanvas);
|
BIN
Webcam Fun [19-30]/snap.mp3
Normal file
BIN
Webcam Fun [19-30]/snap.mp3
Normal file
Binary file not shown.
60
Webcam Fun [19-30]/style.css
Normal file
60
Webcam Fun [19-30]/style.css
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
html {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 10px;
|
||||||
|
background: #ffc600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.photobooth {
|
||||||
|
background: white;
|
||||||
|
max-width: 150rem;
|
||||||
|
margin: 2rem auto;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*clearfix*/
|
||||||
|
.photobooth:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.photo {
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player {
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 20px;
|
||||||
|
width:200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Strip!
|
||||||
|
*/
|
||||||
|
|
||||||
|
.strip {
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.strip img {
|
||||||
|
width: 100px;
|
||||||
|
overflow-x: scroll;
|
||||||
|
padding: 0.8rem 0.8rem 2.5rem 0.8rem;
|
||||||
|
box-shadow: 0 0 3px rgba(0,0,0,0.2);
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.strip a:nth-child(5n+1) img { transform: rotate(10deg); }
|
||||||
|
.strip a:nth-child(5n+2) img { transform: rotate(-2deg); }
|
||||||
|
.strip a:nth-child(5n+3) img { transform: rotate(8deg); }
|
||||||
|
.strip a:nth-child(5n+4) img { transform: rotate(-11deg); }
|
||||||
|
.strip a:nth-child(5n+5) img { transform: rotate(12deg); }
|
Loading…
Reference in New Issue
Block a user