$(document).ready(function(){ var binary_level = 100 var url = document.location.origin var cropper = null var snap = null var width; var height; // Grab elements, create settings, etc. var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var video = document.getElementById('video'); var mediaConfig = { video: true }; var errBack = function(e) { console.log('An error has occurred!', e) }; /** Take a new snapshot from the camera and store it **/ function doSnap(){ cropper && cropper.destroy() context.drawImage(video, 0, 0, width, height); snap = context.createImageData(width, height); snap.data.set( context.getImageData(0, 0, width, height).data ) binary(context) $("#result").show() //$('html, body').animate({scrollTop: $("#result").offset().top}, 2000); cropper = new Cropper(canvas,{ viewMode: 3, autoCropArea: 1 }); } function doContrast(){ cropper && cropper.destroy() context.putImageData(snap,0,0) binary(context) cropper = new Cropper(canvas,{ viewMode: 3, autoCropArea: 1 }); } // https://raw.githubusercontent.com/samdutton/simpl/gh-pages/getusermedia/sources/js/main.js var videoElement = document.querySelector('video'); var videoSelect = document.querySelector('select#videoSource'); videoSelect.onchange = getStream; getStream().then(getDevices).then(gotDevices); function getDevices() { // AFAICT in Safari this only gets default devices until gUM is called :/ return navigator.mediaDevices.enumerateDevices(); } function gotDevices(deviceInfos) { window.deviceInfos = deviceInfos; // make available to console for (const deviceInfo of deviceInfos) { const option = document.createElement('option'); option.value = deviceInfo.deviceId; option.text = deviceInfo.label || `Camera ${videoSelect.length + 1}`; videoSelect.appendChild(option); } } function getStream() { if (window.stream) { window.stream.getTracks().forEach(track => { track.stop(); }); } const videoSource = videoSelect.value; const constraints = { video: {deviceId: videoSource ? {exact: videoSource} : undefined} }; return navigator.mediaDevices.getUserMedia(constraints). then(gotStream).catch(handleError); } function gotStream(stream) { window.stream = stream; // make stream available to console videoSelect.selectedIndex = [...videoSelect.options]. findIndex(option => option.text === stream.getVideoTracks()[0].label); videoElement.srcObject = stream; } function handleError(error) { console.error('Error: ', error); } // https://raw.githubusercontent.com/samdutton/simpl/gh-pages/getusermedia/sources/js/main.js function setCameraResolution( track ){ width = track.getSettings().width height = track.getSettings().height $("#video").attr("width",width) $("#video").attr("height",height) $("#canvas").attr("width",width) $("#canvas").attr("height",height) } // Put video listeners into place if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia(mediaConfig).then(function(stream) { //video.src = window.URL.createObjectURL(stream); video.srcObject = stream; setCameraResolution(stream.getVideoTracks()[0]) video.play(); }); } /* Legacy code below! */ else if(navigator.getUserMedia) { // Standard navigator.getUserMedia(mediaConfig, function(stream) { setCameraResolution(stream.getVideoTracks()[0]) video.src = stream; video.play(); }, errBack); } else if(navigator.webkitGetUserMedia) { // WebKit-prefixed navigator.webkitGetUserMedia(mediaConfig, function(stream){ setCameraResolution(stream.getVideoTracks()[0]) video.src = window.webkitURL.createObjectURL(stream); video.play(); }, errBack); } else if(navigator.mozGetUserMedia) { // Mozilla-prefixed navigator.mozGetUserMedia(mediaConfig, function(stream){ setCameraResolution(stream.getVideoTracks()[0]) video.src = window.URL.createObjectURL(stream); video.play(); }, errBack); } // Trigger photo take $('.snap').on('click', function() { doSnap() }); function binary(context){ /* To convert image into binary , we will threshold it. Based upon the threshold value thresh_red, thresh_blue, thresh_green ==> are the respective red, blue and green color threshold values. Any thing above this threshold value will be denoted by white color and anything below will be black */ var image = context.getImageData(0, 0, context.canvas.width, context.canvas.height); var thresh_red = binary_level; var thresh_green = binary_level; var thresh_blue = binary_level; var channels = image.data.length/4; for(var i=0;i= thresh_red && g>= thresh_green && b>=thresh_blue ){ image.data[i*4 + 0] = 255; image.data[i*4 + 1] = 255; image.data[i*4 + 2] = 255; }else{ image.data[i*4 + 0] = 0; image.data[i*4 + 1] = 0; image.data[i*4 + 2] = 0; } } context.putImageData(image, 0, 0); } $("#result").hide() $( "#slider" ).slider({ range: false, values: [ binary_level ], min : 0, max : 255, change: function(event,ui){ binary_level = ui.value doContrast() } }); $("#send").on("click",function(){ var cropCanvas = cropper.getCroppedCanvas(); image_data = cropCanvas.toDataURL(); $("#messages").html('') $.ajax({ url: url + "/image", method:"POST", dataType: "json", data:{ image_data : image_data, text : $("#text").val() }, }).done(function(d,m,j){ if( d.errors ){ msg = d.errors.join(" / ") $("#messages").html(``) return } $("#messages").html(``) imageList = localStorage.getItem("imageList") ? JSON.parse(localStorage.getItem("imageList")) : [] imageList.push(d.hash_name) localStorage.setItem("imageList",JSON.stringify(imageList)) refreshImageList() }) .fail(function(d,m,jq){ $("#messages").html(``) }) }) var simuCanvas = document.getElementById("simuCanvas"); var ctx = simuCanvas.getContext("2d"); var lastpoint = { x: 0, y: 0, color: 0}; ctx.clearRect(0,0,400,400); var zoom = 0.5; //ctx.save Point = function( l ){ return { "x" : l[0], "y" : l[1], "color" : l[2] } } // Draws every segment received, except black colored target ones var drawSimu = function() { pointsList = document.pointsList if (pointsList.length > 0) { ctx.clearRect(0,0,400,400); lastpoint = new Point(pointsList[0]) for (var i = 0; i < pointsList.length; i+=1) { point = new Point(pointsList[i]) // if the target is black, skip drawing if( point.color != 0){ ctx.beginPath() ctx.shadowBlur = 5; ctx.shadowColor = 'rgba(255, 255, 255, 1)'; ctx.lineWidth = 2; ctx.strokeStyle = "#"+(point.color + Math.pow(16, 6)).toString(16).slice(-6); ctx.moveTo(lastpoint.x * zoom, lastpoint.y * zoom); ctx.lineTo(point.x * zoom, point.y * zoom); ctx.stroke(); ctx.closePath() } lastpoint = point } } } function refreshImageList(){ var imageList = localStorage.getItem("imageList") ? JSON.parse(localStorage.getItem("imageList")) : [] if( 0 == imageList.length){ $("#preview").hide() return } $("#preview").show() html = '' for( id in imageList){ hash_name = imageList[id] html += `
  • ${hash_name}
  • ` } $("#imageList").html(``) } refreshImageList() $("#imageList").on("click",function(e){ var el = e.target var hash_name = $(el).attr("rel") var u = `${url}/hash_name/${hash_name}` $.ajax({ url: `${url}/hash_name/${hash_name}`, dataType: "json", }).done(function(d,m,j){ if( d.errors ){ msg = d.errors.join(" / ") $("#messages").html(``) return } $("#messages").html("") document.pointsList = d.points_list drawSimu() }) .fail(function(d,m,jq){ $("#messages").html(``) }) }) })