diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md index fe15d36..703f85a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# cloudnv -Web app to identify pictures of clouds +# CloudNV + +>Emery Cho, Alyssa Keimach, Vu Vuong, Anders Sajbel + +## Purpose + +CloudNV acquires an image of a cloud, identifies the type of cloud and provides a short description on said cloud. + +## Deployed Site +[CloudNV](http://alyssakeimach.com/cloudnv/) + +## How To Use + +Simply either drag and drop an image, use the file explorer and select an image or enter an image link URL. The process should run automatically at that point and return the description at the bottom of the app. + +## How It Works + +After submitting something, it is first verified as an image. If it is over 4MB we send it to Imgur to store it for the Vision API to examine. Then it is sent to the Google Cloud Vision API. This analyzes the image and returns related tags. These tags first determine whether the image falls under clouds or not. They are then cross referenced with our hard coded cloud arrays. Depending on what tags match, the key words are then sent to the Wikipedia API where it then retrieves the summary section to append to the page for the user to read. + +## APIs Used +1. Imgur API +2. Google Vision API +3. Wikipedia Search API +4. Wikipedia Parse API + +## Libraries Used +1. jQuery +2. Bootstrap +3. Load-Image https://github.com/blueimp/JavaScript-Load-Image diff --git a/assets/css/reset.css b/assets/css/reset.css new file mode 100644 index 0000000..af94440 --- /dev/null +++ b/assets/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..b9a611c --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,140 @@ +.container-fluid { + width: 90%; + height: auto; +} + +.row { + margin: 2rem; +} + +.customBox { + border: .5rem solid #66aede; + border-radius: .5rem; + padding: 1rem; + background-color: rgba(255, 255, 255, 0.4); +} + +.infobox-aside { + border: .3rem solid #66aede; + border-radius: .5rem; + padding: 1rem; +} + +.toggle { + text-decoration: none; + color: #31708f; + font-size: 18px; + font-weight: 600; +} + +.toggle:hover { + text-decoration: none; + color: #173848; + font-weight: 700; +} + +.panel { + background-color: #66aede; + color: white; + height: 80px; + text-align: center; +} + +.drag { + margin: auto; + border: 2px dotted #66aede; + color: #31708f; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + padding: 10px; + font-size: 200%; + background-color: rgba(255, 255, 255, 0.4); + width: 100%; +} + +.drag:hover { + background-color: rgba(255, 255, 255, 0.6); +} + + +.uploadWanted { + height: 300px; +} + +.dropInfo { + margin: auto; + padding: 1rem; + font-weight: 700; +} + +.upload { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; +} + +.uploadLabel { + font-size: 32px; + font-weight: 700; + margin: auto; + width: 80%; + height: 80%; + display: flex; + align-items: center; + justify-content: center; +} + +.upload:focus+label, +.uploadLabel:hover { + color: #173848; +} + +.uploadBox { + display: table-cell; + vertical-align: middle; +} + +.imageCloud { + width: 100%; + margin-bottom: 1rem; +} + +.linkBtn { + background-color: rgba(102, 174, 222, 0.6); +} + +.linkBtn:hover { + background-color: rgba(102, 174, 222, 0.8); +} + +#cloud-type {} + +#cloud-fact {} + +#cloudDesc {} + +#cloud-gif {} + +.img-center { + display: block; + margin: 0 auto; +} + +body { + min-width: 320px; + background: url(../images/weather.png) no-repeat center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + +} + +h3 { + margin-left: 2rem; +} \ No newline at end of file diff --git a/assets/images/cloud_icon.png b/assets/images/cloud_icon.png new file mode 100644 index 0000000..c47cb7b Binary files /dev/null and b/assets/images/cloud_icon.png differ diff --git a/assets/images/clouds.gif b/assets/images/clouds.gif new file mode 100644 index 0000000..5ddefff Binary files /dev/null and b/assets/images/clouds.gif differ diff --git a/assets/images/lion_king.jpg b/assets/images/lion_king.jpg new file mode 100644 index 0000000..1bdd535 Binary files /dev/null and b/assets/images/lion_king.jpg differ diff --git a/assets/images/lion_king_left.jpg b/assets/images/lion_king_left.jpg new file mode 100644 index 0000000..73ba93e Binary files /dev/null and b/assets/images/lion_king_left.jpg differ diff --git a/assets/images/lion_king_right.jpg b/assets/images/lion_king_right.jpg new file mode 100644 index 0000000..1bdd535 Binary files /dev/null and b/assets/images/lion_king_right.jpg differ diff --git a/assets/images/weather.png b/assets/images/weather.png new file mode 100644 index 0000000..8c4086f Binary files /dev/null and b/assets/images/weather.png differ diff --git a/assets/javascript/app.js b/assets/javascript/app.js new file mode 100644 index 0000000..0aede19 --- /dev/null +++ b/assets/javascript/app.js @@ -0,0 +1,348 @@ +var countAsync = 0; +var divMatches = $("
"); + + +function isURL(imageData) { + var urlPattern = new RegExp("^(https?:\\/\\/)?" + // protocol + "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name and extension + "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address + "(\\:\\d+)?" + // port + "(\\/[-a-z\\d%@_.~+&:]*)*" + // path + "(\\?[;&a-z\\d%@_.,~+&:=-]*)?" + // query string + "(\\#[-a-z\\d_]*)?$", "i"); // fragment locator + return urlPattern.test(imageData); +} + + + +function getCloudDescriptor(visionResults) { + var searchWordArray = []; + for (var i = 0; i < visionResults.length; i++) { + if ((cloudSpeciesArray.indexOf(visionResults[i]) !== -1)) { + searchWordArray.push(visionResults[i]); + } + } + if (searchWordArray.length === 1) { + searchWordArray.push("cloud"); + } + if (searchWordArray.length === 0) { + // if no specific descriptors were found, check the broad categories + for (var i = 0; i < visionResults.length; i++) { + if ((cloudGeneraArray.indexOf(visionResults[i]) !== -1)) { + searchWordArray.push(visionResults[i]); + } + } + } + if (searchWordArray.length > 0) { + console.log("chosen words: " + searchWordArray); + return searchWordArray; + } + return searchWordArray; +} + + + +function checkAsyncResults() { + if (countAsync === 0) { // Each asynchronous call (increment) has been completed (decrement) + $("#cloudDesc").empty(); + if (divMatches.children().length === 0) { + divMatches.append("

Couldn't identify cloud

"); + parseWikiAPI(1461163, "List of cloud types"); + $("#cloudDesc").append(divMatches); + } else { + $("#cloudDesc").append("

Matching Cloud Types

"); + $("#cloudDesc").append(divMatches); + } + } +} + + + +function parseWikiAPI(pageID, title) { + + var wikiURL = "https://en.wikipedia.org/w/api.php?exintro=&explaintext=&" + $.param({ + "action": "query", + "format": "json", + "prop": "extracts|categories|revisions", // Same as parsing wikitext but better! Plain text only! Bye regex! + "titles": title, + "rvprop": "content", // For infobox secion + "rvsection": 0 + }); + + $.ajax({ + url: wikiURL, + dataType: "jsonp" + }).done(function(result) { + + var cloudCategory = false; + var categories = result.query.pages[pageID].categories; + // To check if the article is about clouds, check the category + for (var i = 0; i < categories.length; i++) { + var parseCategory = categories[i].title.toLowerCase(); + if (parseCategory.indexOf("cloud") !== -1) { + //atmospheric, weather, cloud types + cloudCategory = true; + } else { + for (var c = 0; c < cloudGeneraArray.length; c++) { + if (parseCategory.indexOf(cloudGeneraArray[c]) !== -1) { + cloudCategory = true; + } + } + } + // console.log(title, parseCategory); + } + + if (cloudCategory) { + var contentDiv = $("
"); + contentDiv.addClass("row"); + contentDiv.addClass("m-2"); + + var titleDiv = $("
"); + titleDiv.addClass("col-md-12"); + titleDiv.append("

" + title + "

"); + contentDiv.append(titleDiv); + + var extractDiv = $("
"); + extractDiv.append("

" + result.query.pages[pageID].extract + "

"); + + var infoboxArray = result.query.pages[pageID].revisions[0]["*"].replace(/{{convert[^}]+}}/g, ""); + infoboxArray = infoboxArray.replace(/\[\[|\]\]/g, ""); + infoboxArray = infoboxArray.match(/{{Infobox[^}]+}}/); + + if (infoboxArray) { + var infoboxSplit = infoboxArray[0].split("|"); + var infoDiv = $("
"); + infoDiv.addClass("infobox-aside col-md-4"); + var infoList = $("
    "); + + infoboxSplit.forEach(function(element) { + if (element.indexOf("=") !== -1) { + var pair = element.split("="); + if ((wikiInfoBox.indexOf(pair[0].trim()) !== -1) && (pair[1].trim() !== "")) { + var key = pair[0].trim(); + key = key.charAt(0).toUpperCase() + key.slice(1); + var quant = pair[1].trim(); + quant = quant.replace(/\'\'/g, "\""); + quant = quant.replace(/}}/g, ""); + + infoList.append("
  • " + key + ": " + quant + "
  • "); + } + } + }); + infoDiv.append(infoList); + extractDiv.addClass("col-md-8"); + contentDiv.append(extractDiv); + contentDiv.append(infoDiv); + } + else { + extractDiv.addClass("col-md-12"); + contentDiv.append(extractDiv); + } + divMatches.append(contentDiv); + } + + countAsync--; + checkAsyncResults(); + + }).fail(function(err) { + throw err; + }); +} + + + +function queryWikiAPI(searchWordArray) { + + var wikiURL = "https://en.wikipedia.org/w/api.php?" + $.param({ + "action": "query", + "list": "search", + "srsearch": searchWordArray.join(" "), + "srwhat": "text", + "format": "json" + }); + + $.ajax({ + url: wikiURL, + dataType: "jsonp" + }).done(function(result) { + console.log("wikipedia query results", result.query.search); + countAsync = 0; + divMatches.empty(); + result.query.search.forEach(function(article) { + if ((article.title.search("List")) && (article.title.search("Cloud")) && (article.title.indexOf("Media") === -1)) { + countAsync++; + // Need two API calls because can't return categories and extracts for each article in same call - generator max 1 + parseWikiAPI(article.pageid, article.title); + } + }); + + }).fail(function(err) { + throw err; + }); +} + + + +function queryVisionAPI(imageData) { + // imageData is either a url or base 64 encoded string + var imageDataString; + if (isURL(imageData)) { + imageDataString = '"source":{"imageUri":"' + imageData + '"}'; + } else { + imageDataString = '"content":"' + imageData + '"'; + } + var request = '{"requests":[{"image":{' + imageDataString + '},"features":[{"type":"WEB_DETECTION","maxResults":10},{"type":"LABEL_DETECTION","maxResults":10}]}]}'; + + var response = new XMLHttpRequest; + response.open("POST", "https://vision.googleapis.com/v1/images:annotate?key=" + apiKey.vision, !0); + response.send(request); + + response.onload = function() { + + var visionResults = []; + var result = JSON.parse(response.responseText); + + if (result.responses[0].error) { + // Check if there was a response + // TODO: notify user there was a time-out + console.log(result.responses[0].error); + displayError(result.responses[0].error.message); + } else { + var queryResults = result.responses[0].webDetection.webEntities.concat(result.responses[0].labelAnnotations); + queryResults.sort(function(a, b) { // Sort the vision api results by score + return parseFloat(b.score) - parseFloat(a.score); + }); + console.log(queryResults); + for (var i = 0; i < queryResults.length; i++) { + var resultWord = queryResults[i].description; + if (resultWord) { + resultWord = resultWord.toLowerCase(); + var wordArray = resultWord.split(" "); + for (var j = 0; j < wordArray.length; j++) { + if (visionResults.indexOf(wordArray[j]) === -1) { + visionResults.push(wordArray[j]); + } + } + } + } + console.log(visionResults); + var searchWordArray = getCloudDescriptor(visionResults); + if (searchWordArray.length > 0) { + // if the cloud type was found in our cloud word array + queryWikiAPI(searchWordArray); + } else { + checkAsyncResults(); + } + } + }; +}; + + + +$("#submit").on("click", function(event) { + event.preventDefault(); + var imageData = $("#image-url").val().trim(); + if (imageData !== "") { + displayPic(imageData); + $("#image-url").val(""); + $("#image-url").attr("placeholder", imageData); + queryVisionAPI(imageData); + } +}); + + +var wikiInfoBox = [ + "name", + "abbreviation", + "genus", + "species", + "altitude", + "appearance", + "precipitation" +]; + +var cloudGeneraArray = [ + "nimbostratus", + "cumulonimbus", + "cirrus", + "cirrostratus", + "cirrocumulus", + "altostratus", + "altocumulus", + "stratus", + "stratocumulus", + "cumulus" +]; + +var cloudSpeciesArray = [ + "virga", + "tornato", + "sundogs", + "pyrocumulus", + "pileus", + "noctilucent", + "nacreous", + "mammatus", + "kelvin–helmholtz", + "fallstreak", + "distrail", + "contrail", + "contrails", + "arcus", + "mushroom", + "spissatus", + "calvus", + "capillatus", + "cirrocumulogenitus", + "cumulonimbogenitus", + "homogenitus", + "cirromutatus", + "cirrocumulomutatus", + "altostratomutatus", + "cirrostratomutatus", + "altocumulogenitus", + "stratocumuliform", + "altocumulomutatus", + "cumuliform", + "volutus", + "undulatus", + "translucidus", + "radiatus", + "lacunosus", + "uncinus", + "stratiformis", + "stratiformus", + "stratiform", + "mediocris", + "lenticularis", + "lenticular", + "humilis", + "fractus", + "fibratus", + "congestus", + "castellanus", + "nebulosus", + "opacus", + "perlucidus", + "duplicatus", + "floccus", + "intortus", + "vertebratus", + "iridescence", + "circumhorizontal", + "mutatus", + "genitus", + "mackerel", + "incus", + "pannus", + "praecipitatio", + "tuba", + "velum", + "cirriform", + "columnar", + "tropospheric", + "asperitas", + "stratospheric", + "polar", + "non-nacreous" +]; \ No newline at end of file diff --git a/assets/javascript/imgur.js b/assets/javascript/imgur.js new file mode 100644 index 0000000..edb5dcf --- /dev/null +++ b/assets/javascript/imgur.js @@ -0,0 +1,344 @@ +// Sends image directly to vision api +// Don't use if image is over 4MB +// Also rotates the image if necessary for display +// image is a base64 image URL string +// orientation is a number between 1 and 8 that should be obtained +// with the getOrientation method. +function sendImageDirect(image, orientation = 1) { + var base64result = image.replace(/^data:image\/[a-z]+;base64,/, ""); + console.log("Image is less than 4MB") + queryVisionAPI(base64result); +} + +// Sends the image to Imgur to be stored and then Vision. +// Use if image is greater than 4MB. +// Requires a base64Image string with the prepending tags striped out. +function sendImageImgur(image, orientation = 1) { + var base64result = image.replace(/^data:image\/[a-z]+;base64,/, ""); + console.log("Image is greater than 4MB, wait for Imgur"); + var form = new FormData(); + form.append("image", base64result); + + var settings = { + "async": true, + "crossDomain": true, + "url": "https://api.imgur.com/3/image", + "method": "POST", + "headers": { + "authorization": `Client-ID ${apiKey.imgur_client_id}` + }, + "processData": false, + "contentType": false, + "mimeType": "multipart/form-data", + "data": form + } + + $.ajax(settings).done(function(response) { + var res = JSON.parse(response); + console.log(res); + queryVisionAPI(res.data.link); + // displayPic(res.data.link); + }); +} + +//from http://stackoverflow.com/a/32490603 +//Gets the orientation alteration of an image +// based on this picture https://i.stack.imgur.com/VGsAj.gif +//file is a file blob +//call back is the function to perform after completion +// with the paramater of the orientation variable +function getOrientation(file, callback) { + var reader = new FileReader(); + + reader.onload = function(event) { + var view = new DataView(event.target.result); + + if (view.getUint16(0, false) != 0xFFD8) return callback(-2); + + var length = view.byteLength, + offset = 2; + + while (offset < length) { + var marker = view.getUint16(offset, false); + offset += 2; + + if (marker == 0xFFE1) { + if (view.getUint32(offset += 2, false) != 0x45786966) { + return callback(-1); + } + var little = view.getUint16(offset += 6, false) == 0x4949; + offset += view.getUint32(offset + 4, little); + var tags = view.getUint16(offset, little); + offset += 2; + + for (var i = 0; i < tags; i++) + if (view.getUint16(offset + (i * 12), little) == 0x0112) + return callback(view.getUint16(offset + (i * 12) + 8, little)); + } else if ((marker & 0xFF00) != 0xFF00) break; + else offset += view.getUint16(offset, false); + } + return callback(-1); + }; + + reader.readAsArrayBuffer(file.slice(0, 64 * 1024)); +}; + +//from https://stackoverflow.com/a/40867559/8630411 +//Resets the orientation of an base64 image url string +// based on the orientation from getOrientaion +// or this image https://i.stack.imgur.com/VGsAj.gif +//srcBase64 is a base64 url string +//srcOrientation is a number between 2 and 8 +//callback is the function to perform after the orientaion has finished +function resetOrientation(srcBase64, srcOrientation, callback) { + console.log("Transforming image, please wait"); + var img = new Image(); + + img.onload = function() { + var width = img.width, + height = img.height, + canvas = document.createElement('canvas'), + ctx = canvas.getContext("2d"); + + // set proper canvas dimensions before transform & export + if (4 < srcOrientation && srcOrientation < 9) { + canvas.width = height; + canvas.height = width; + } else { + canvas.width = width; + canvas.height = height; + } + + // transform context before drawing image + switch (srcOrientation) { + case 2: + ctx.transform(-1, 0, 0, 1, width, 0); + break; + case 3: + ctx.transform(-1, 0, 0, -1, width, height); + break; + case 4: + ctx.transform(1, 0, 0, -1, 0, height); + break; + case 5: + ctx.transform(0, 1, 1, 0, 0, 0); + break; + case 6: + ctx.transform(0, 1, -1, 0, height, 0); + break; + case 7: + ctx.transform(0, -1, -1, 0, height, width); + break; + case 8: + ctx.transform(0, -1, 1, 0, 0, width); + break; + default: + break; + } + + // draw image + ctx.drawImage(img, 0, 0); + + // export base64 + callback(canvas.toDataURL()); + }; + + img.src = srcBase64; +} + +//If the image is not oriented properly uses the resetOrientation function to +// reorient the image +function orientDisplayPic(picture, orientation) { + if (orientation > 1) { + resetOrientation(picture, orientation, function rotate(rotated) { + displayPic(rotated); + }); + } else { + displayPic(picture); + } +} + +//Displays picture on the page +//picture is a valid string for that an image src tag can use +function displayPic(picture) { + $("#displayImage").attr("src", picture); + $("#displayImage").removeClass("hidden"); + $("#drag").removeClass("uploadWanted"); + displayLoad(); + +} + + +//Display a message and gif to give the user feed back that the program is doing something +//Empties the cloudDesc element, puts it there and uses clouds.gif +function displayLoad() { + var load = $(""); + load.addClass("img-center img-responsive"); + load.attr("src", "assets/images/clouds.gif"); + load.attr("id", "cloud-gif"); + $("#cloudDesc").empty(); + $("#cloudDesc").attr("hidden", false); + $("#cloudDesc").append("

    Searching for cloud types

    "); + $("#cloudDesc").append(load); +} + +//Display a message to the user, meant to be for errors +//Empties the cloudDesc element and puts the message there +function displayError(message, id = "cloudDesc") { + $("#" + id).empty(); + setTimeout(function() { + $("#" + id).attr("hidden", false); + $("#" + id).append("

    " + message + "

    "); + }, 48); +} + +//Make sure that a file is an image and if so sends to the FileReader +//file is a valid file blob +function readPic(file) { + console.log(file); + var fileType = file["type"].split("/")[0]; + if (fileType !== "image") { + displayError("Not an image, please use a valid image format: \ + JPEG, PNG8, PNG24, GIF, Animated GIF (first frame only), BMP, WEBP, RAW, or ICO"); + + } else { + loadImage.parseMetaData(file, function(data) { + //default image orientation + var orientation = 0; + //if exif data available, update orientation + if (data.exif) { + orientation = data.exif.get('Orientation'); + } + var loadingImage = loadImage( + file, + function(canvas) { + //here's the base64 data result + var base64data = canvas.toDataURL('image/jpeg'); + displayPic(base64data); + if (file.size < 4000000) { + sendImageDirect(base64data); + } else { + sendImageImgur(base64data); + } + }, { + //should be set to canvas : true to activate auto fix orientation + canvas: true, + orientation: orientation + } + ); + }); + // getOrientation(file, function checkRotate(orientation) { + // console.log(orientation); + // var reader = new FileReader(); + // getImageBase64(file, function(image) { + // if (file.size < 4000000) { + // orientDisplayPic(image, orientation); + // sendImageDirect(image, orientation); + // } else { + // orientDisplayPic(image, orientation); + // sendImageImgur(image, orientation); + // } + // }); + // }); + } +} + + +//Takes a file blob and returns a base64dataURL +function getImageBase64(file, callback) { + var reader = new FileReader(); + reader.onload = function gotImage(event) { + var image = event.target.result; + callback(image) + }; + reader.readAsDataURL(file); +} + +//Checks if a string is a base65URL +//returns boolean +function isBase64image(base64string) { + var legal = base64string[base64string.length - 1] === "="; + console.log(legal); + var base64reg = new RegExp(/data:image\/([a-zA-Z]*);base64,([^\"]*)/); + var valid = base64reg.test(base64string); + console.log(valid); + var image = base64string.search(/data:image/) !== -1; + console.log(image); + return (legal && valid && image); +} + +$(document).ready(function addUpload() { + + var imgur_client_id = "cffdbdcf9cb88c7"; + var imgur_sec = "4e806c50fb260cc521bfe11d4e7edfa22cfbf684"; + var authURL = "https://api.imgur.com/oauth2/authorize?client_id=" + imgur_client_id + "&response_type=token" + var auth_token = "" + + var refreshForm = new FormData(); + refreshForm.append("refresh_token", "4c771b1e1055e3eb3adee452a2155ebd258392d1"); + refreshForm.append("client_id", "cffdbdcf9cb88c7"); + refreshForm.append("client_secret", "4e806c50fb260cc521bfe11d4e7edfa22cfbf684"); + refreshForm.append("grant_type", "refresh_token"); + + //adds drag and drop listeners to the drag element + $("#drag").on('dragover', function(event) { + event.stopPropagation(); + event.preventDefault(); + console.log('dragover'); + $(this).css('border', '2px solid #66aede'); + $(this).css('background-color', 'rgba(255,255,255,0.6)'); + $(this).css('color', '#173848'); + }); + $("#drag").on('dragleave', function(event) { + event.stopPropagation(); + event.preventDefault(); + console.log('dragleave'); + $(this).css('border', '2px dotted #66aede'); + $(this).css('background-color', 'rgba(255,255,255,0.4)'); + $(this).css('color', '#31708f'); + }); + $("#drag").on('drop', function(event) { + event.stopPropagation(); + event.preventDefault(); + $(this).css('border', '2px dotted #66aede'); + $(this).css('background-color', 'rgba(255,255,255,0.4)'); + $(this).css('color', '#31708f'); + + var files = event.originalEvent.dataTransfer.files; + console.log(files.length === 0); + if (files.length !== 0) { + //We need to send dropped files to Server + console.log(files); + for (var i = 0; i < files.length; i++) { + readPic(files[i]); + } + } else { + var url = $(event.originalEvent.dataTransfer.getData('text/html')).filter('img').attr('src'); + console.log(url); + if (isURL(url)) { + console.log("Upload from another site"); + displayPic(url); + queryVisionAPI(url); + } else + if (isBase64image(url)) { + console.log("Upload from another site"); + displayPic(url); + queryVisionAPI(url); + } else { + displayError("Not a valid URL"); + } + } + }); + + $("#uploadBtn").on("change", function readFile(event)  { + + console.log(event); + console.log($(this)); + + for (var i = 0; i < this.files.length; i++) { + readPic(this.files[i]); + } + + }); + +}); \ No newline at end of file diff --git a/assets/javascript/keys.js b/assets/javascript/keys.js new file mode 100644 index 0000000..d9b70f7 --- /dev/null +++ b/assets/javascript/keys.js @@ -0,0 +1,4 @@ +var apiKey = { + vision: "AIzaSyCx1GhLhN-MJGgS4uItlichD2gxgtWQag8", + imgur_client_id: "cffdbdcf9cb88c7" +} \ No newline at end of file diff --git a/assets/javascript/load-image.all.min.js b/assets/javascript/load-image.all.min.js new file mode 100644 index 0000000..acd7113 --- /dev/null +++ b/assets/javascript/load-image.all.min.js @@ -0,0 +1,2 @@ +!function(e){"use strict";function t(e,i,a){var o,n=document.createElement("img");return n.onerror=function(o){return t.onerror(n,o,e,i,a)},n.onload=function(o){return t.onload(n,o,e,i,a)},"string"==typeof e?(t.fetchBlob(e,function(i){i?(e=i,o=t.createObjectURL(e)):(o=e,a&&a.crossOrigin&&(n.crossOrigin=a.crossOrigin)),n.src=o},a),n):t.isInstanceOf("Blob",e)||t.isInstanceOf("File",e)?(o=n._objectURL=t.createObjectURL(e))?(n.src=o,n):t.readFile(e,function(e){var t=e.target;t&&t.result?n.src=t.result:i&&i(e)}):void 0}function i(e,i){!e._objectURL||i&&i.noRevoke||(t.revokeObjectURL(e._objectURL),delete e._objectURL)}var a=e.createObjectURL&&e||e.URL&&URL.revokeObjectURL&&URL||e.webkitURL&&webkitURL;t.fetchBlob=function(e,t,i){t()},t.isInstanceOf=function(e,t){return Object.prototype.toString.call(t)==="[object "+e+"]"},t.transform=function(e,t,i,a,o){i(e,o)},t.onerror=function(e,t,a,o,n){i(e,n),o&&o.call(e,t)},t.onload=function(e,a,o,n,r){i(e,r),n&&t.transform(e,r,n,o,{})},t.createObjectURL=function(e){return!!a&&a.createObjectURL(e)},t.revokeObjectURL=function(e){return!!a&&a.revokeObjectURL(e)},t.readFile=function(t,i,a){if(e.FileReader){var o=new FileReader;if(o.onload=o.onerror=i,a=a||"readAsDataURL",o[a])return o[a](t),o}return!1},"function"==typeof define&&define.amd?define(function(){return t}):"object"==typeof module&&module.exports?module.exports=t:e.loadImage=t}("undefined"!=typeof window&&window||this),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t=e.transform;e.transform=function(i,a,o,n,r){t.call(e,e.scale(i,a,r),a,o,n,r)},e.transformCoordinates=function(){},e.getTransformedOptions=function(e,t){var i,a,o,n,r=t.aspectRatio;if(!r)return t;i={};for(a in t)t.hasOwnProperty(a)&&(i[a]=t[a]);return i.crop=!0,o=e.naturalWidth||e.width,n=e.naturalHeight||e.height,o/n>r?(i.maxWidth=n*r,i.maxHeight=n):(i.maxWidth=o,i.maxHeight=o/r),i},e.renderImageToCanvas=function(e,t,i,a,o,n,r,s,l,d){return e.getContext("2d").drawImage(t,i,a,o,n,r,s,l,d),e},e.hasCanvasOption=function(e){return e.canvas||e.crop||!!e.aspectRatio},e.scale=function(t,i,a){function o(){var e=Math.max((l||v)/v,(d||P)/P);e>1&&(v*=e,P*=e)}function n(){var e=Math.min((r||v)/v,(s||P)/P);e<1&&(v*=e,P*=e)}i=i||{};var r,s,l,d,c,u,f,g,h,m,p,S=document.createElement("canvas"),b=t.getContext||e.hasCanvasOption(i)&&S.getContext,y=t.naturalWidth||t.width,x=t.naturalHeight||t.height,v=y,P=x;if(b&&(f=(i=e.getTransformedOptions(t,i,a)).left||0,g=i.top||0,i.sourceWidth?(c=i.sourceWidth,void 0!==i.right&&void 0===i.left&&(f=y-c-i.right)):c=y-f-(i.right||0),i.sourceHeight?(u=i.sourceHeight,void 0!==i.bottom&&void 0===i.top&&(g=x-u-i.bottom)):u=x-g-(i.bottom||0),v=c,P=u),r=i.maxWidth,s=i.maxHeight,l=i.minWidth,d=i.minHeight,b&&r&&s&&i.crop?(v=r,P=s,(p=c/u-r/s)<0?(u=s*c/r,void 0===i.top&&void 0===i.bottom&&(g=(x-u)/2)):p>0&&(c=r*u/s,void 0===i.left&&void 0===i.right&&(f=(y-c)/2))):((i.contain||i.cover)&&(l=r=r||l,d=s=s||d),i.cover?(n(),o()):(o(),n())),b){if((h=i.pixelRatio)>1&&(S.style.width=v+"px",S.style.height=P+"px",v*=h,P*=h,S.getContext("2d").scale(h,h)),(m=i.downsamplingRatio)>0&&m<1&&vv;)S.width=c*m,S.height=u*m,e.renderImageToCanvas(S,t,f,g,c,u,0,0,S.width,S.height),f=0,g=0,c=S.width,u=S.height,(t=document.createElement("canvas")).width=c,t.height=u,e.renderImageToCanvas(t,S,0,0,c,u,0,0,c,u);return S.width=v,S.height=P,e.transformCoordinates(S,i),e.renderImageToCanvas(S,t,f,g,c,u,0,0,v,P)}return t.width=v,t.height=P,t}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t="undefined"!=typeof Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice);e.blobSlice=t&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},e.metaDataParsers={jpeg:{65505:[]}},e.parseMetaData=function(t,i,a,o){a=a||{},o=o||{};var n=this,r=a.maxMetaDataSize||262144;!!("undefined"!=typeof DataView&&t&&t.size>=12&&"image/jpeg"===t.type&&e.blobSlice)&&e.readFile(e.blobSlice.call(t,0,r),function(t){if(t.target.error)return console.log(t.target.error),void i(o);var r,s,l,d,c=t.target.result,u=new DataView(c),f=2,g=u.byteLength-4,h=f;if(65496===u.getUint16(0)){for(;f=65504&&r<=65519||65534===r);){if(s=u.getUint16(f+2)+2,f+s>u.byteLength){console.log("Invalid meta data: Invalid segment size.");break}if(l=e.metaDataParsers.jpeg[r])for(d=0;d6&&(c.slice?o.imageHead=c.slice(0,h):o.imageHead=new Uint8Array(c).subarray(0,h))}else console.log("Invalid JPEG file: Missing JPEG marker.");i(o)},"readAsArrayBuffer")||i(o)},e.hasMetaOption=function(e){return e&&e.meta};var i=e.transform;e.transform=function(t,a,o,n,r){e.hasMetaOption(a)?e.parseMetaData(n,function(r){i.call(e,t,a,o,n,r)},a,r):i.apply(e,arguments)}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";"undefined"!=typeof fetch&&"undefined"!=typeof Request&&(e.fetchBlob=function(t,i,a){if(e.hasMetaOption(a))return fetch(new Request(t,a)).then(function(e){return e.blob()}).then(i).catch(function(e){console.log(e),i()});i()})}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";e.ExifMap=function(){return this},e.ExifMap.prototype.map={Orientation:274},e.ExifMap.prototype.get=function(e){return this[e]||this[this.map[e]]},e.getExifThumbnail=function(e,t,i){var a,o,n;{if(i&&!(t+i>e.byteLength)){for(a=[],o=0;o4?i+t.getUint32(a+8,r):a+8)+s>t.byteLength)){if(1===n)return g.getValue(t,l,r);for(d=[],c=0;ce.byteLength)console.log("Invalid Exif data: Invalid directory offset.");else{if(n=e.getUint16(i,a),!((r=i+2+12*n)+4>e.byteLength)){for(s=0;st.byteLength)console.log("Invalid Exif data: Invalid segment size.");else if(0===t.getUint16(i+8)){switch(t.getUint16(d)){case 18761:r=!0;break;case 19789:r=!1;break;default:return void console.log("Invalid Exif data: Invalid byte alignment marker.")}42===t.getUint16(d+2,r)?(s=t.getUint32(d+4,r),o.exif=new e.ExifMap,(s=e.parseExifTags(t,d,d+s,r,o))&&!n.disableExifThumbnail&&(l={exif:{}},s=e.parseExifTags(t,d,d+s,r,l),l.exif[513]&&(o.exif.Thumbnail=e.getExifThumbnail(t,d+l.exif[513],l.exif[514]))),o.exif[34665]&&!n.disableExifSub&&e.parseExifTags(t,d,d+o.exif[34665],r,o),o.exif[34853]&&!n.disableExifGps&&e.parseExifTags(t,d,d+o.exif[34853],r,o)):console.log("Invalid Exif data: Missing TIFF marker.")}else console.log("Invalid Exif data: Missing byte alignment offset.")}},e.metaDataParsers.jpeg[65505].push(e.parseExifData)}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-exif"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-exif")):e(window.loadImage)}(function(e){"use strict";e.ExifMap.prototype.tags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright",36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",42240:"Gamma",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubSecTime",37521:"SubSecTimeOriginal",37522:"SubSecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"PhotographicSensitivity",34856:"OECF",34864:"SensitivityType",34865:"StandardOutputSensitivity",34866:"RecommendedExposureIndex",34867:"ISOSpeed",34868:"ISOSpeedLatitudeyyy",34869:"ISOSpeedLatitudezzz",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRatio",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",42016:"ImageUniqueID",42032:"CameraOwnerName",42033:"BodySerialNumber",42034:"LensSpecification",42035:"LensMake",42036:"LensModel",42037:"LensSerialNumber",0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential",31:"GPSHPositioningError"},e.ExifMap.prototype.stringValues={ExposureProgram:{0:"Undefined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Undefined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},ComponentsConfiguration:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"},Orientation:{1:"top-left",2:"top-right",3:"bottom-right",4:"bottom-left",5:"left-top",6:"right-top",7:"right-bottom",8:"left-bottom"}},e.ExifMap.prototype.getText=function(e){var t=this.get(e);switch(e){case"LightSource":case"Flash":case"MeteringMode":case"ExposureProgram":case"SensingMethod":case"SceneCaptureType":case"SceneType":case"CustomRendered":case"WhiteBalance":case"GainControl":case"Contrast":case"Saturation":case"Sharpness":case"SubjectDistanceRange":case"FileSource":case"Orientation":return this.stringValues[e][t];case"ExifVersion":case"FlashpixVersion":if(!t)return;return String.fromCharCode(t[0],t[1],t[2],t[3]);case"ComponentsConfiguration":if(!t)return;return this.stringValues[e][t[0]]+this.stringValues[e][t[1]]+this.stringValues[e][t[2]]+this.stringValues[e][t[3]];case"GPSVersionID":if(!t)return;return t[0]+"."+t[1]+"."+t[2]+"."+t[3]}return String(t)},function(e){var t,i=e.tags,a=e.map;for(t in i)i.hasOwnProperty(t)&&(a[i[t]]=t)}(e.ExifMap.prototype),e.ExifMap.prototype.getAll=function(){var e,t,i={};for(e in this)this.hasOwnProperty(e)&&(t=this.tags[e])&&(i[t]=this.getText(t));return i}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-scale","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-scale"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";var t=e.hasCanvasOption,i=e.hasMetaOption,a=e.transformCoordinates,o=e.getTransformedOptions;e.hasCanvasOption=function(i){return!!i.orientation||t.call(e,i)},e.hasMetaOption=function(t){return t&&!0===t.orientation||i.call(e,t)},e.transformCoordinates=function(t,i){a.call(e,t,i);var o=t.getContext("2d"),n=t.width,r=t.height,s=t.style.width,l=t.style.height,d=i.orientation;if(d&&!(d>8))switch(d>4&&(t.width=r,t.height=n,t.style.width=l,t.style.height=s),d){case 2:o.translate(n,0),o.scale(-1,1);break;case 3:o.translate(n,r),o.rotate(Math.PI);break;case 4:o.translate(0,r),o.scale(1,-1);break;case 5:o.rotate(.5*Math.PI),o.scale(1,-1);break;case 6:o.rotate(.5*Math.PI),o.translate(0,-r);break;case 7:o.rotate(.5*Math.PI),o.translate(n,-r),o.scale(-1,1);break;case 8:o.rotate(-.5*Math.PI),o.translate(-n,0)}},e.getTransformedOptions=function(t,i,a){var n,r,s=o.call(e,t,i),l=s.orientation;if(!0===l&&a&&a.exif&&(l=a.exif.get("Orientation")),!l||l>8||1===l)return s;n={};for(r in s)s.hasOwnProperty(r)&&(n[r]=s[r]);switch(n.orientation=l,l){case 2:n.left=s.right,n.right=s.left;break;case 3:n.left=s.right,n.top=s.bottom,n.right=s.left,n.bottom=s.top;break;case 4:n.top=s.bottom,n.bottom=s.top;break;case 5:n.left=s.top,n.top=s.left,n.right=s.bottom,n.bottom=s.right;break;case 6:n.left=s.top,n.top=s.right,n.right=s.bottom,n.bottom=s.left;break;case 7:n.left=s.bottom,n.top=s.right,n.right=s.top,n.bottom=s.left;break;case 8:n.left=s.bottom,n.top=s.left,n.right=s.top,n.bottom=s.right}return n.orientation>4&&(n.maxWidth=s.maxHeight,n.maxHeight=s.maxWidth,n.minWidth=s.minHeight,n.minHeight=s.minWidth,n.sourceWidth=s.sourceHeight,n.sourceHeight=s.sourceWidth),n}}); +//# sourceMappingURL=load-image.all.min.js.map \ No newline at end of file diff --git a/assets/javascript/load-image.all.min.js.map b/assets/javascript/load-image.all.min.js.map new file mode 100644 index 0000000..ee5f23d --- /dev/null +++ b/assets/javascript/load-image.all.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["load-image.js","load-image-scale.js","load-image-meta.js","load-image-fetch.js","load-image-exif.js","load-image-exif-map.js","load-image-orientation.js"],"names":["$","loadImage","file","callback","options","url","img","document","createElement","onerror","event","onload","fetchBlob","blob","createObjectURL","crossOrigin","src","isInstanceOf","_objectURL","readFile","e","target","result","revokeHelper","noRevoke","revokeObjectURL","urlAPI","URL","webkitURL","type","obj","Object","prototype","toString","call","transform","data","method","FileReader","fileReader","define","amd","module","exports","window","this","factory","require","originalTransform","scale","transformCoordinates","getTransformedOptions","newOptions","i","width","height","aspectRatio","hasOwnProperty","crop","naturalWidth","naturalHeight","maxWidth","maxHeight","renderImageToCanvas","canvas","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","destWidth","destHeight","getContext","drawImage","hasCanvasOption","scaleUp","Math","max","minWidth","minHeight","scaleDown","min","pixelRatio","downsamplingRatio","tmp","useCanvas","left","top","undefined","right","bottom","contain","cover","style","hasblobSlice","Blob","slice","webkitSlice","mozSlice","blobSlice","apply","arguments","metaDataParsers","jpeg","65505","parseMetaData","that","maxMetaDataSize","DataView","size","error","console","log","markerBytes","markerLength","parsers","buffer","dataView","offset","maxOffset","byteLength","headLength","getUint16","length","disableImageHead","imageHead","Uint8Array","subarray","hasMetaOption","meta","fetch","Request","then","response","catch","err","ExifMap","map","Orientation","get","id","getExifThumbnail","hexData","b","getUint8","push","join","exifTagTypes","1","getValue","dataOffset","2","String","fromCharCode","ascii","3","littleEndian","4","getUint32","5","9","getInt32","10","getExifValue","tiffOffset","tagSize","values","str","c","tagType","parseExifTag","tag","exif","parseExifTags","dirOffset","tagsNumber","dirEndOffset","parseExifData","disableExif","thumbnailData","disableExifThumbnail","Thumbnail","disableExifSub","disableExifGps","tags","256","257","34665","34853","40965","258","259","262","274","277","284","530","531","282","283","296","273","278","279","513","514","301","318","319","529","532","306","270","271","272","305","315","33432","36864","40960","40961","40962","40963","42240","37121","37122","37500","37510","40964","36867","36868","37520","37521","37522","33434","33437","34850","34852","34855","34856","34864","34865","34866","34867","34868","34869","37377","37378","37379","37380","37381","37382","37383","37384","37385","37396","37386","41483","41484","41486","41487","41488","41492","41493","41495","41728","41729","41730","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","42016","42032","42033","42034","42035","42036","42037","0","6","7","8","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","stringValues","ExposureProgram","MeteringMode","255","LightSource","Flash","32","65","69","71","73","77","79","89","93","95","SensingMethod","SceneCaptureType","SceneType","CustomRendered","WhiteBalance","GainControl","Contrast","Saturation","Sharpness","SubjectDistanceRange","FileSource","ComponentsConfiguration","getText","value","exifMapPrototype","prop","getAll","originalHasCanvasOption","originalHasMetaOption","originalTransformCoordinates","originalGetTransformedOptions","orientation","ctx","styleWidth","styleHeight","translate","rotate","PI","opts"],"mappings":"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"} \ No newline at end of file diff --git a/imgur.html b/imgur.html new file mode 100644 index 0000000..2c7b526 --- /dev/null +++ b/imgur.html @@ -0,0 +1,131 @@ + + + + + IMGUR TEST + + + + +
    + + +
    + +
    + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..52f065a --- /dev/null +++ b/index.html @@ -0,0 +1,60 @@ + + + + + + + + CloudNV + + + + + + + + +
    +

    CloudNV

    +
    + +
    +
    +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + + + + + + + + +