Photo booth

This commit is contained in:
2026-01-31 18:27:19 +01:00
parent 2d2fc24d71
commit ee97b8faab
8 changed files with 258 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
// See https://davidwalsh.name/browser-camera
const shutterSound = new Audio('shutter.mp3');
const countdownSound = new Audio('ding.mp3');
let countingDown = false;
$(document).ready(function() {
// Check if configuration is present
try {
BASEURL
} catch (e) {
alert("config.js not found!");
return;
}
// Shutter button press
$(window).keydown(function(event){
switch(event.keyCode) {
case 13:
case 32:
onShutterButtonPressed();
break
default:
console.log(`Ignored keypress ${event.keyCode}`)
}
});
// Get access to the camera!
var video = $('#video')[0];
if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
// Not adding `{ audio: true }` since we only want video now
navigator.mediaDevices.getUserMedia({ video: {
width: 3840,
height: 2160
} }).then(function(stream) {
//video.src = window.URL.createObjectURL(stream);
video.srcObject = stream;
video.play();
});
}
});
function onShutterButtonPressed() {
if (!countingDown)
countdown(COUNTDOWN_FROM, takePhoto);
}
function countdown(from, onCountdownElapsed) {
countingDown = true;
const countdownEl = $('#countdown');
if (from > 0) {
if (from === COUNTDOWN_FROM)
countdownEl.show();
countdownSound.play();
setTimeout(function() {countdown(from - 1, onCountdownElapsed)}, 1000);
} else {
countingDown = false;
countdownEl.hide();
onCountdownElapsed();
}
countdownEl.text(from);
}
function takePhoto() {
const canvas = $('#canvas');
const canvasContainer = $('#canvas-container');
const flash = $('#flash');
const context = canvas[0].getContext('2d');
context.drawImage(video, 0, 0, 3840, 2160);
canvasContainer.show();
flash.show();
$('#video').addClass('blurred');
shutterSound.play();
uploadImage();
// Hide flash
setTimeout(function() {
flash.hide();
}, 200)
// Hide canvas
setTimeout(function() {
canvasContainer.hide();
$('#video').removeClass('blurred');
}, 5000);
}
function uploadImage() {
document.querySelector("#canvas").toBlob(function(blob) {
let file = new File([blob], 'photobooth.jpg', { type: 'image/jpeg' });
let data = new FormData();
data.append('image', file);
let request = new XMLHttpRequest();
request.open('POST', `${BASEURL}/api/gallery_item/upload.php`);
request.setRequestHeader('Authentication', TOKEN);
request.addEventListener('load', function(e) {
console.log(request.response);
});
request.send(data);
saveLocalImage(file);
}, 'image/jpeg', 1);
}
/**
* Saves the image locally for backup
*/
function saveLocalImage(blob) {
const fileName = `photobooth-${Date.now()}`
if (typeof navigator.msSaveBlob == "function")
return navigator.msSaveBlob(blob, fileName);
var saver = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
var blobURL = saver.href = URL.createObjectURL(blob),
body = document.body;
saver.download = fileName;
body.appendChild(saver);
saver.dispatchEvent(new MouseEvent("click"));
body.removeChild(saver);
URL.revokeObjectURL(blobURL);
}