mirror of
https://github.com/publiclab/image-sequencer.git
synced 2025-12-11 19:00:00 +01:00
139 lines
4.8 KiB
JavaScript
139 lines
4.8 KiB
JavaScript
// TODO: potentially move this into ImportImage module
|
|
function setInputStepInit() {
|
|
|
|
return function setInputStep(options) {
|
|
|
|
var dropzone = $(options.dropZoneSelector);
|
|
var fileInput = $(options.fileInputSelector);
|
|
var takePhoto = $(options.takePhotoSelector);
|
|
|
|
var onLoad = options.onLoad;
|
|
var onTakePhoto = options.onTakePhoto;
|
|
|
|
var reader = new FileReader();
|
|
|
|
function handleFile(e) {
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation(); // stops the browser from redirecting.
|
|
|
|
if (e.target && e.target.files) var file = e.target.files[0];
|
|
else var file = e.dataTransfer.files[0];
|
|
if(!file) return;
|
|
|
|
var reader = new FileReader();
|
|
|
|
reader.onload = onLoad;
|
|
|
|
reader.readAsDataURL(file);
|
|
}
|
|
|
|
function runVideo(){
|
|
/* event handler for Take-Photo */
|
|
document.getElementById('video').style.display = 'inline';
|
|
document.getElementById('capture').style.display = 'inline';
|
|
document.getElementById('close').style.display = 'inline';
|
|
|
|
fileInput.css('display', 'none');
|
|
takePhoto.css('display', 'none');
|
|
document.getElementById('dropzone-text').style.display = 'none';
|
|
|
|
var video = document.getElementById('video');
|
|
canvas = document.getElementById('canvas'),
|
|
context = canvas.getContext('2d'),
|
|
vendorUrl = window.URL || window.webkitURL;
|
|
|
|
const constraints = { audio: false, video: true};
|
|
|
|
function handleSuccess(stream) {
|
|
window.stream = stream; // make stream available to browser console
|
|
video.srcObject = stream;
|
|
video.onloadedmetadata = function(e) {
|
|
video.play();
|
|
};
|
|
|
|
document.getElementById('capture').addEventListener('click', function(){
|
|
context.drawImage(video, 0, 0, 400, 300);
|
|
options.onTakePhoto(canvas.toDataURL());
|
|
setTimeout(stopStream(stream),1); // wait for 1 second before closing webcam so that image loads properly
|
|
});
|
|
|
|
document.getElementById('close').addEventListener('click', function () {
|
|
stopStream(stream);
|
|
});
|
|
}
|
|
function handleError(error) {
|
|
console.log('navigator.getUserMedia error: ', error);
|
|
|
|
// when user dismissed the camera access (includes closing of prompt which requests for camera access)
|
|
if(error.message == 'Permission denied' || error.message == 'NotAllowedError' || error.message == 'PermissionDismissedError'){
|
|
document.getElementById('capture').addEventListener('click', function(e) {
|
|
alert('Enable camera access in order to take picture');
|
|
});
|
|
}
|
|
|
|
// when user don't have webcam to use.
|
|
if(error.message == 'NotFoundError' || error.message == 'DevicesNotFoundError'){
|
|
alert('You do not have appropriate devices to use this Functionality');
|
|
}
|
|
|
|
// when webcam is already used by some other application
|
|
if(error.message == 'NotReadableError' || error.message == 'TrackStartError' || error.message == 'Concurrent mic process limit'){
|
|
alert('Your webcam is already in use by some other application');
|
|
}
|
|
|
|
// when some of the requested constraints can't be satisfied like high frame rate or high resolution
|
|
if(error.message == 'OverconstrainedError' || error.message == 'ConstraintNotSatisfiedError'){
|
|
console.log('Requested Constraints can not be satisfied ', error);
|
|
}
|
|
}
|
|
navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
|
|
|
|
document.getElementById('close').addEventListener('click', function() {
|
|
video.style.display = 'none';
|
|
});
|
|
|
|
|
|
function stopStream(stream) {
|
|
stream.getVideoTracks().forEach(function (track) {
|
|
track.stop();
|
|
});
|
|
document.getElementById('video').style.display = 'none';
|
|
document.getElementById('capture').style.display = 'none';
|
|
document.getElementById('close').style.display = 'none';
|
|
|
|
fileInput.css('display', 'block');
|
|
takePhoto.css('display', 'block');
|
|
document.getElementById('dropzone-text').style.display = 'block';
|
|
}
|
|
}
|
|
|
|
fileInput.on('change', handleFile);
|
|
takePhoto.on('click', runVideo);
|
|
|
|
dropzone[0].addEventListener('drop', handleFile, false);
|
|
|
|
dropzone.on('dragover', function onDragover(e) {
|
|
dropzone.addClass('hover');
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
});
|
|
|
|
dropzone.on('dragenter', function onDragEnter(e) {
|
|
dropzone.addClass('hover');
|
|
});
|
|
|
|
dropzone.on('dragleave', function onDragLeave(e) {
|
|
dropzone.removeClass('hover');
|
|
});
|
|
|
|
dropzone.on('drop', function onDrop(e) {
|
|
dropzone.removeClass('hover');
|
|
e.preventDefault();
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
module.exports = setInputStepInit;
|