/*
* JavaScript Load Image Demo JS
* https://github.com/blueimp/JavaScript-Load-Image
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
/* global loadImage, $ */
$(function() {
'use strict'
var result = $('#result')
var exifNode = $('#exif')
var iptcNode = $('#iptc')
var thumbNode = $('#thumbnail')
var actionsNode = $('#actions')
var currentFile
var coordinates
var jcropAPI
/**
* Displays tag data
*
* @param {*} node jQuery node
* @param {object} tags Tags object
*/
function displayTagData(node, tags) {
var table = node.find('table').empty()
var row = $('
')
var cell = $(' | ')
var prop
for (prop in tags) {
if (Object.prototype.hasOwnProperty.call(tags, prop)) {
table.append(
row
.clone()
.append(cell.clone().text(prop))
.append(cell.clone().text(tags[prop]))
)
}
}
node.show()
}
/**
* Displays the thumbnal image
*
* @param {*} node jQuery node
* @param {string} thumbnail Thumbnail URL
* @param {object} [options] Options object
*/
function displayThumbnailImage(node, thumbnail, options) {
if (thumbnail) {
thumbNode.empty()
loadImage(
thumbnail,
function(img) {
node.append(img).show()
},
options
)
}
}
/**
* Displays meta data
*
* @param {object} [data] Meta data object
*/
function displayMetaData(data) {
if (!data) return
var exif = data.exif
var iptc = data.iptc
if (exif) {
displayThumbnailImage(thumbNode, exif.get('Thumbnail'), {
orientation: exif.get('Orientation')
})
displayTagData(exifNode, exif.getAll())
}
if (iptc) {
displayTagData(iptcNode, iptc.getAll())
}
}
/**
* Updates the results view
*
* @param {*} img Image or canvas element
* @param {object} [data] Meta data object
*/
function updateResults(img, data) {
var fileName = currentFile.name
var href = currentFile.url || img.src
var dataURLStart
var content
if (!(img.src || img instanceof HTMLCanvasElement)) {
content = $('Loading image file failed')
} else {
if (!href) {
href = img.toDataURL(currentFile.type)
// Check if file type is supported for the dataURL export:
dataURLStart = 'data:' + currentFile.type
if (href.slice(0, dataURLStart.length) !== dataURLStart) {
fileName = fileName.replace(/\.\w+$/, '.png')
}
}
content = $('')
.append(img)
.attr('download', fileName)
.attr('href', href)
}
result.children().replaceWith(content)
if (img.getContext) {
actionsNode.show()
}
displayMetaData(data)
}
/**
* Displays the image
*
* @param {File|Blob|string} file File or Blob object or image URL
*/
function displayImage(file) {
var options = {
maxWidth: result.width(),
canvas: true,
pixelRatio: window.devicePixelRatio,
downsamplingRatio: 0.5,
orientation: true
}
exifNode.hide()
iptcNode.hide()
thumbNode.hide()
if (!loadImage(file, updateResults, options)) {
result
.children()
.replaceWith(
$(
'' +
'Your browser does not support the URL or FileReader API.' +
''
)
)
}
}
/**
* Handles drop and file selection change events
*
* @param {event} event Drop or file selection change event
*/
function fileChangeHandler(event) {
event.preventDefault()
var originalEvent = event.originalEvent
var target = originalEvent.dataTransfer || originalEvent.target
var file = target && target.files && target.files[0]
if (!file) {
return
}
currentFile = file
displayImage(file)
}
/**
* Handles URL change events
*/
function urlChangeHandler() {
var url = $(this).val()
if (!url || (currentFile && currentFile.url === url)) return
currentFile = {
name: url.replace(/^.*\//g, ''),
url: url
}
displayImage(url)
}
// Hide URL/FileReader API requirement message in capable browsers:
if (
window.createObjectURL ||
window.URL ||
window.webkitURL ||
window.FileReader
) {
result.children().hide()
}
$(document)
.on('dragover', function(e) {
e.preventDefault()
var originalEvent = event.originalEvent
if (originalEvent) originalEvent.dataTransfer.dropEffect = 'copy'
})
.on('drop', fileChangeHandler)
$('#file-input').on('change', fileChangeHandler)
$('#url').on('change paste input', urlChangeHandler)
$('#edit').on('click', function(event) {
event.preventDefault()
var imgNode = result.find('img, canvas')
var img = imgNode[0]
var pixelRatio = window.devicePixelRatio || 1
imgNode
// eslint-disable-next-line new-cap
.Jcrop(
{
setSelect: [
40,
40,
img.width / pixelRatio - 40,
img.height / pixelRatio - 40
],
onSelect: function(coords) {
coordinates = coords
},
onRelease: function() {
coordinates = null
}
},
function() {
jcropAPI = this
}
)
.parent()
.on('click', function(event) {
event.preventDefault()
})
})
$('#crop').on('click', function(event) {
event.preventDefault()
var img = result.find('img, canvas')[0]
var pixelRatio = window.devicePixelRatio || 1
if (img && coordinates) {
updateResults(
loadImage.scale(img, {
left: coordinates.x * pixelRatio,
top: coordinates.y * pixelRatio,
sourceWidth: coordinates.w * pixelRatio,
sourceHeight: coordinates.h * pixelRatio,
minWidth: result.width(),
maxWidth: result.width(),
pixelRatio: pixelRatio,
downsamplingRatio: 0.5
})
)
coordinates = null
}
})
$('#cancel').on('click', function(event) {
event.preventDefault()
if (jcropAPI) jcropAPI.release()
})
})